2012-08-02 6 views
2

이 코드가 모두있는 부분을 구현하는 활동이 있습니다. 이것은 코드가 기밀이기 때문에 예제를 통해 가장 잘 설명됩니다. 이 예제는 수행하려는 작업과 테스트를 통해 관찰 한 작업을 반영합니다. 로더 ID가있는 두 개의 고유 로더 (Loader ID, Loader 1, Loader 2)에서 두 개의 고유 한 객체 (A, B)를 가져 오는 RSS 리더 단편을 가지고 있습니다.) I가 객체 A로부터 반환 partialArcticlePreviewList 하단 안타 로더 2 "restartloader를 사용하여 다른 문서를 인출 가능한 문서를 스크롤하면 오브젝트 A를 반입 로더 1"initloader "호출 생성시AsyncTaskLoader 캐시 데이터는 어떻게됩니까?

Object A: 

int[] fullArticleIdList; 
List<ArticlePreview> partialArcticlePreviewList; 

Object B: 

List<ArticlePreview> partialArcticlePreviewList; 

개체 B를 가져 와서 사용자가 읽을 수있게하고 모든 기사에 대해이 작업을 계속합니다.

이것은 사용자가 장치를 회전 할 때까지 작동하므로 onCreate를 호출합니다. 이제 initloader가 Loader 1에서 호출되면 loader 1에 연결 한 후 즉시 onLoadFinished로 이동하고 Loader 1을 반환합니다. articleIds가 제대로 반환되면 partialArcticlePreviewList는 Loader 2에서 객체 B를 반입 한 객체입니다.

로더 관리자는 객체의 한 인스턴스를 캐시에 보관하고 여러 로더간에 공유합니까? 그것은 로더 2의 partialArcticlePreviewList에서 수신 된 데이터로 Loader 1의 partialArcticlePreviewList를 덮어 썼다는 것을 광범위한 테스트 (5 시간 이상 발견하고 이클립스 디버거에서 로더 ID/캐시/주소를보고 문제를 발견 한 것)에서 보일 것입니다. 이 상황이 하나의 로더에 이상적이지만 각 로더의 캐시는 개별적이라고 생각했을 것입니다. 분명히 로더의 장점 중 하나는 화면 회전과 데이터 캐싱을 통한 사용 용이성과 지속성 이었지만 묵시적으로 작동하지는 않는 것 같습니다. 우리는 조각의 인스턴스를 유지하고 메모리 누수를 피하기 위해 onCreateView 및 onDestroyView에 적절한 코드를 작성함으로써이 문제를 우회했지만 이것이 좋은 해결책입니까?

편집 : 추가를 잊어 버렸습니다. 호환성 라이브러리 v4를 사용 중입니다. 또한 로더에 대한 안드로이드 소스를 살펴보면 왜 로더가 "mId"라는 잘못된 데이터를 반환하는지 상황을 알 수 없었습니다.

답변

3

이 문제를 피하기 위해 사용 된 최종 해결책은 단순히 데이터를 직접 관리하고 로더에 의존하지 않는 것입니다.

로더는 화면에 대해 한 가지만로드 할 때 데이터를 유지하지만, 페이징 때문에 이러한 모든 번거 로움을 만들었고 작동하는 방식은 여전히 ​​잘 이해되지 않았습니다. 결론은 예상대로 작동하지 않았거나 구현이 잘못되어 고급 사용 사례에서만 분명 해지는 것입니다.

데이터를 직접 관리하려면 onDestroyView에서 모든 항목을 올바르게 정리하는 동안 번들/유지 조각을 사용하고 있습니다. 또한 로더는 순환 후 콜백을 수행 할 때 데이터 세트에 이미 데이터가 있는지 확인하여 페이지 데이터를 데이터 세트에 두 번 추가하지 않습니다. 또 다른 대안은 싱글 톤 객체를 사용하는 것입니다.

앞으로 도움이되기를 바랍니다.

+0

저는 일주일 동안이 문제를 해결하려고 노력하고 있습니다. 제가 볼 수있는 예제 코드가 있습니까? 감사!. –

+0

코드가 없지만 https://stackoverflow.com/questions/7181526/example-of-implementing-parcelable을 시도해 볼 수 있습니다. 본질적으로 asynctaskloader를 사용하여 데이터를 가져 와서 처음에는 구획에 저장할 수 있습니다. 그런 다음 후속 콜백에서 asynctaskloader를 무시합니다. parcelable은 정상적인 라이프 사이클 조건에 사용됩니다. –

관련 문제