2010-08-22 3 views
3

저는 홈 화면 위젯을 ImageView로 작성했습니다. 코드는 전체 위젯을 생성하고이를 비트 맵으로 RemoteViews에 씁니다. 내 G1과 같이 메모리가 적은 저속 장치에서는 비트 맵을 생성하는 데 몇 초가 걸리므로 무시 무시한 강제 종료를 피하기 위해 모든 그래픽 코드를 AsyncTask로 옮겼습니다. 여태까지는 그런대로 잘됐다.메모리 부족 상태에서 AsyncTask를 활성 상태로 유지 하시겠습니까?

그러나 매우 낮은 메모리 조건에서는 AsyncTask가 비트 맵 생성을 완료하기 전에 OS에서 쉽게 종료 될 수 있으므로 홈 스크린에 빈 칸이 나타납니다. AsyncTask를 생성하기 전에 이제는 + 5 초 동안 알람을 설정하고 그래픽이 완료된 후 알람을 재설정합니다. 여기에서는 알람이 트리거되면 프로세스가 종료 된 것보다 더 많은 알람을 설정하고 다시 시작해야한다는 가정이 있습니다.

이것은 작동하지만 메모리가 극단적으로 낮 으면 위젯을 그리는 데 몇 번의 시도 (20 초 이상)가 걸릴 수 있으므로 placeholder 모래 시계 이미지를 정적 리소스로 추가 할 때까지 홈 화면에 표시됩니다. 실제 이미지가 준비되었습니다.

제 질문은 이것이 최선의 방법입니까? 그것이 완료 될 때까지 (정중하게) OS가 AsyncTask를 죽이지 않도록 요청할 것인가? (사실상 죽이면 시스템 리소스가 이 될 것입니다.) more 시스템 자원 낭비?

나는 프로세스가 "보이는"것으로 분류되면 안드로이드는 최후의 수단을 제외하고는 그것을 죽이지 않는다는 것을 알고 있습니다. 하지만 AsyncTask에 "보이는"태그를 붙이는 방법을 모르겠습니다. 위젯을 그리 자마자 바로 프로세스가 죽는 것이 무척 기쁩니다. 완료하기 위해 오래 살아 있어야합니다.

답변

0

IntentService를 사용해 보셨습니까? 서비스 코드가 실행되는 동안 포어 그라운드 작업과 동일한 종료 우선 순위가 부여됩니다. AsyncTask와 같은 위젯과는 꽤 밀접한 연관성은 없지만 코드 완성의 가능성을 높일 것이라고 생각합니다.

+0

방금 ​​시도해 보았지만 몇 시간을 다른 설정으로 사용했습니다. START_STICKY, setForeground() 및 WAKE_LOCK 획득으로 시도했습니다. 불행히도, 그들 중 누구도 낮은 메모리 상황에서 코드를 유지하지 않았고, 현재 사용중인 알람 코드만큼 쉽고 빠르게 복구하지 못했습니다. – Andy

+3

Google의 Android OS 코드 중 일부를 조사해 보았는데 AsyncTask를 사용할 때 AsyncTask 내에서 빈 서비스가 시작되고 주석에 따라 작업이 종료되지 않도록주의해야합니다. 670 행의이 파일에서 이에 대한 참조를 볼 수 있습니다 : http://android.git.kernel.org/?p=platform/packages/apps/Contacts.git; a = blob; f = src/com/android/contacts/ui/EditContactActivity.java; h = 3e248ea93dc8b17a0d66306aaade9ea398c32408; hb = HEAD – Mike

0

서비스 클래스를 사용하려고하면 "전경"으로 서비스를 설정할 수 있습니다. Foreground 서비스가 종료 될 확률은 거의 없습니다.

또한 서비스는 비동기와 동일합니다.

작업이 끝나면 서비스를 종료하십시오.

1

EmptyService에 바인드하고 작업이 완료되면 바인딩 해제하여 사용하십시오 (https://github.com/android/platform_packages_providers_calendarprovider/blob/master/src/com/android/providers/calendar/EmptyService.java 참조). 나는 이것이 당신이 과정이 죽지 않을 것이라는 것을 보장하는지 아니면 단순히 죽을 확률을 줄이는 지 확실하지 않습니다.

포 그라운드 서비스를 사용할 수도 있지만 상태 표시 줄 알림을 제공해야합니다 (http://developer.android.com/guide/components/services.html#Foreground 참조).

또는 @Mike suggest로 IntentService를 사용할 수 있습니다. 나는 문서에서 "전경 작업과 같은 우선 순위를 얻는다"는 것을 볼 수는 없지만.

관련 문제