2012-02-26 2 views
2

긴 데이터베이스 쿼리를 수행하고 PostExecute의 결과 데이터 뷰를 채우기 위해 여러 곳에서 AsyncTasks를 사용합니다. 그러나 거기에 도착할 때까지 사용자는 내 앱에서 화면 (조각)을 전환하거나 앱을 실행기로 다시 '종료'할 수있었습니다.안드로이드 : Activity가 끝날 때 AsyncTask를위한 우수 사례

지금 당장은 약간의 kludgey 메서드를 사용하여 AsyncTask가 업데이트를 만들기 전에 Activity가 아직 살아 있는지 확인합니다. 그러나 이것이 정말로 필요한가? 다양한 View 객체가 여전히 존재하는 태스크가 활성화되어있는 한 오랫동안 사용할 수있는 것처럼 보이므로 유용하지는 않지만 업데이트하면 아무 것도 해가되지 않습니다.

누구나 AsyncTasks의 동작을 조정하는 데 대한 아이디어가 있습니까?

답변

2

종료 된 활동에 대한 참조를 유지하면 활동과 관련된 모든 것이 gc'ed되지 않으므로 심각한 메모리 문제가 발생할 수 있습니다. 이 문제에 대한 Android 개발자 그룹의 흥미로운 주제가 있습니다. 가장 유용한 게시물은 here입니다.

또한 AsyncTask의 결함과 그에 대한 조치에 대해서는 this thread을 참조하십시오.

편집 : AsyncTasksetRetainInstance(true);이라고 불리는 조각을 사용하는 경우에만 사용되는 Santiago Lezica의 this useful blog post도 있습니다.

+0

이 꽤 많이 나는 이미으로 실행했습니다 및 AsyncTasks을 사용하는 개는에 대해 결론을 내렸다 것을 요약 http://developer.android.com/guide/topics/fundamentals/loaders.html

HTH하십시오 Loader 구현에 대한 자세한 정보를 알아볼 수

는 관련 개발자 가이드를 참조하십시오. 팁 고마워! – gordonwd

0

백그라운드 작업이 거의 데이터베이스 쿼리에만 국한되어 있으므로 AsyncTask 대신 CursorLoader을 사용하여 데이터를 쿼리 해 보시기 바랍니다. 3.0을 목표로하지 않는 경우에도 호환성 라이브러리를 통해 사용할 수 있습니다. 그것들은이 목적을 위해서만 설계되었습니다; 시스템이 백그라운드 작업과 Cursor을 관리 할 수있게합니다.

Loader 프로토콜은 Activity에 바인딩하고 콜백을 발사할지 여부를 처리하는 LoaderManager를 통해 통신, 그래서 당신은 등록 취소에 대해 걱정하지 않아도 사용자가 최신 갱신하기 전에 떠나면 그것의 완료 문제 없어.

+0

로더는 흥미로운 아이디어이며 V2.2가 최신 버전 일 때이 앱을 처음 작성한 이후로 나는 그 사실을 알지 못했습니다. 그러나 실제로 백그라운드에서 쿼리를 수행하는 것보다 훨씬 더 많은 작업을 수행하고 있으며이 방법을 구현할 수 있는지 확실하지 않습니다. 그러나 나는 그것을 조사 할 것이다. – gordonwd

+0

꽤 확장 성이있어, 항상 자신 만의 'CursorLoader'를 만들 수 있습니다. – Devunwired