2010-08-16 4 views
0

나는 큰 이진 블록을 수신하고 그것을 유용한 Java 객체로 파싱하는 Network Client 클래스를 가지고있다. 네트워크 클라이언트는 앱의보기와 별도의 스레드에 있습니다. 이 객체를 View에서 사용할 수있게하는 가장 좋은 방법은 무엇입니까? 나는 다음과 같은 해결책을 왔어요,하지만 그들 중 누구도 같은 느낌은 정확 하나입니다 :Android에서 활동 내에서 큰 객체를 공유하려면 어떻게해야하나요?

  1. 가 직접 가
    • 에게 내가 보낼 것 보기 액세스 네트워크 클라이언트에서 개체를 만들고하자 보기에 데이터가 업데이트되었음을 ​​알리는 처리기의 작은 메시지
    • 단점 :보기가 액세스하는 동안 네트워크 클라이언트가 개체를 대체하지 못하도록 스레드간에 개체를 동기화해야합니다.
  2. 직렬화 (? 소포) 네트워크 클라이언트에서 개체 및보기에 처리기를 통해 전송하는
    • 프로 :
    • 콘 데이터의 소유권의 어떠한 질문이 없습니다 : 아마에 큰 성과 드레인 것 응용 프로그램
  3. 는 개체에 대한 참조를 만들고 난 C++ 배경에서 오는보기
    • 에 그 전달하고,이 자바로도 가능하다 있는지 확실하지 않습니다. 난 C + +, 난 그냥 개체에 포인터를 보내고 그것을 돌볼 수 있습니다. 자바가 저에게 허락하지 않는 것처럼 보입니다. 이것이 가능한가?

이러한 솔루션 중 어느 것이 좋습니다인가, 아니면 완전히 다른 방식으로 문제를 접근해야합니까?

답변

0

활동이 백그라운드에있을 때 다운로드하지 않으려면 스레드가 아닌 차단하지 않는 IO를 사용하십시오.

활동이 백그라운드에있을 때 계속 다운로드하려면 서비스를 사용하고 싶을 것입니다. 당신은 Parcelable 또는 그와 같은 객체를 만들 수 있습니다; 내 기본 서비스 구현 포인터를 주위에 귀하의 활동과 서비스가 동일한 프로세스 내에서 (나는 그들이 기본적으로 있다고 생각하지만, ICBW) 통과 생각합니다.

+0

많은 생각을하지 않은 것은 매우 좋은 질문입니다. 네트워크 클라이언트가 서비스가되어야한다고 생각합니다. 내가 백그라운드에서 다운로드하지 않는다면, 내가 듣고있는 소켓은 앱이 다시 시작될 때 이전 데이터로 완전히 채워질 것입니다. 네트워크 클라이언트를 서비스로 전환 할 것이므로 활동과 공유하고 싶은 모든 데이터를 올바르게 구분해야합니다. 대체 방법이 없나요? – Topher

+0

로컬 서비스를 사용하는 경우 getter 및 setter를 만들고 다른 객체와 마찬가지로 서비스와 통신 할 수 있습니다. 자세한 내용은 지역 서비스를 검색하십시오. – Janusz

+0

내가 말했듯이, 그것은 달려있다. 동일한 프로세스에서 실행중인 경우 기본 구현은 데이터를 복사하는 대신 포인터를 전달하려고 시도합니다. –

0

객체가 너무 크고 get 메소드로 반환하는 것이 불편할 경우 SQLite 데이터베이스에 내용을 넣고 선택적으로 ContentProvider로 노출 할 수 있습니다. 인 텐트를 보내서 뷰를 이동시켜 페이로드를 가져 오거나 인 텐트에 첨부 할 수도 있습니다.

+0

좋은 답변이지만 SQLite와 같은 외부 저장소를 사용하지 않는 것이 좋습니다. – Topher

+0

SQLite에서 외부 저장소를 사용할 필요는 없으며 /data/data/com.domain.appname/ 디렉토리를 사용할 수 있습니다. 자세한 내용은 다음 링크를 참조하십시오. http://developer.android.com/guide/topics/data/data-storage.html#filesInternal – Frank

0

이 클래스를 서브 클래 싱하고 매니페스트에서 이것을 참조하는 클래스를 보면 서비스의/다운로드 컨트롤러에 대한 참조를 앱의 모든 활동에서 사용할 수있는 중앙 위치에 저장할 수 있습니다. 이렇게하면 데이터를 메모리에 보관할 수 있고 큰 개체를 여러 곳에서 필요로 할 경우 큰 개체를 다시 만들 필요가 줄어들며 하나의 작업 만 수행 할 수 있습니다.

다운로드의 경우 바인더 개체를 통해 사용자의 활동과 통신하는 로컬 service을 사용할 수 있습니다. 서비스는 스레드가 아닙니다. 백그라운드에서 다운로드를 실행하려면 서비스의 oncreate 메소드에서 스레드를 만들어야합니다.

서비스가 사용자에게 서비스를 제공하고 사용자가 서비스에 액세스하고 취소하거나 상태를 볼 수 있도록 주석을 표시하는 것이 좋습니다.

관련 문제