2013-02-26 1 views
0

CursorLoader를 통해 채워지는 listview가 있습니다. CursorLoader는 LoaderManager.LoaderCallback의 createLoader 메서드로 만듭니다. 나는 이것에 아무런 문제가 없다. 문제는 listview 채우기가 완료되면 다른 작업을 시작하고 listviews에 추가 데이터를 채우고 싶다는 것입니다. 현재 내 솔루션은 onLoadFinished 메서드 내에서 다른 로더를 시작하는 것입니다.다른 로더에서 로더를 시작하십시오. 옳고 그름?

이 올바른 해결책입니까 아니면 더 우아하고 효율적인 방법으로 할 수 있습니까? 안드로이드 개발에 많은 경험이 없기 때문에 조언을 해줄 수 있습니까? 미리 감사드립니다.

+0

왜 데이터를 가져 오기 위해 2 번 통화해야합니까? 두 번째 로더를 시작하는 방아쇠는 무엇입니까? 더 많은 데이터를 표시하는 일종의 목록 항목 클릭입니까? – Sean

+0

목록보기에서 보이는 항목들에 대해서만 이것을하고 싶을 것입니다. 그러나 초기 목록 데이터 바로 뒤에 모든 항목에 대한 추가 데이터를로드 한 다음 한 단계에서 동일한 로더에서 추가 데이터를로드하면됩니다. –

+0

@Sean 첫 번째로드에서는 콜 로그를 수집하고 두 번째에서는 위치와 같은 각 전화 번호에 대한 추가 정보를 수집합니다. – Azat

답변

3

로드 중 onLoadFinished에서 문제없이 작동합니다. 내가 가진 애완 동물 프로젝트에서 비슷한 것을했습니다. 내 자신의 ContentProvider에서 데이터를로드하고 거기에서 휴대 전화의 Contact ContentProvider에서 연락처 데이터를로드했습니다. 내 db의 각 항목은 여러 연락처를 참조 할 수 있으므로로드 할 연락처 정보를 알기 전에 항목을로드해야했습니다. onLoadFinished에서 처음으로 항목 데이터를 받았을 때의 init/restart LoaderManager 호출을 묶었습니다. 그것은 잘 작동하고 나중에 연락처 데이터를 목록으로 사용했습니다. 기존의 목록보기 항목 내부의보기에 데이터를로드하는 데이 방법을 사용하지 않았습니다. 내 항목의 세부 정보보기에서 자체 목록의 데이터를 사용했습니다. 그것은 당신이하고 싶은 일과 함께 여전히 작동해야하지만 뷰와 다른 것들에 데이터를 추가하는 것이 지저분해질 수 있습니다. 특히 뷰 "수명주기"가 사용자의 제어 범위를 벗어 났으므로.

IMO는보기가 생성 될 때 AsyncTask 또는 AsyncQueryHandler를 사용하여 추가 데이터를 가져 오는 사용자 지정 CursorAdapter를 코딩하는 것이 더 좋습니다. 목록을 스크롤하면서 이후 사용을 위해 데이터를 캐시하십시오. 이 두 번째 방법은 외부/보조 로더와 독립적 인 이점이 있습니다. 누락 된 부품을로드하는 것을 포함하여 필요한 데이터를 표시하는 데 필요한 모든 로직을 캡슐화합니다. 뷰 데이터와 디스플레이 로직을 일관성있게 유지하고 재사용 가능한 모듈 안에 안전하게 넣을 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 두 번째 접근법에서 목록의 각 행에 대해 새로운 비동기 작업이 있습니까? 그렇다면 로우 엔드 장치에서 성능이 저하되지 않습니까? – Azat

+0

AsyncTask를 예로 들었습니다. 로딩 작업이 상대적으로 짧은 경우 (몇 초) 문제가되지 않습니다. 그리고 전에 말했던 것처럼 결과를 캐시하여 뷰가 스크롤 될 때마다 가져올 필요가 없습니다. 작업을 완료하는 데 더 많은 시간이 필요하거나 더 긴 작업을 실행하는 경우 [ThreadPoolExecutor] (http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html) 사용을 고려해야합니다. 이들은보다 효율적이고 제어 된 멀티 스레딩 솔루션을 제공하며 스레드를 계속 확인하는 데 매우 유용합니다. – ebarrenechea

관련 문제