인스턴스 상태를 저장하는 방법이나 화면 회전 중에 파괴되는 내 활동을 처리하는 방법에 대해 많이 읽었습니다.
많은 가능성이있는 것 같지만 AsyncTask의 결과를 검색하는 데 가장 적합한 방법을 찾지 못했습니다.
나는 단순히 다시 시작 isFinishing()
되고 활동 의 메소드를 호출하는 AsyncTasks가 있으며 활동이 완료되면 아무것도 업데이트하지 않습니다.
문제는 실패하거나 성공할 수있는 웹 서비스에 대한 요청을 수행하는 하나의 작업이 있고 작업을 다시 시작하면 사용자에게 재정적 손실이 발생한다는 것입니다.
이 문제를 어떻게 해결 하시겠습니까? 가능한 솔루션의 장단점은 무엇입니까?
답변
내 첫 번째 제안은 화면 회전 (기본 동작)에서 실제로 활동을 재설정해야하는지 확인하는 것입니다. 회전에 문제가있을 때마다이 속성을 <activity>
AndroidManifest.xml의 내 태그에 추가 했으며 괜찮 았습니다.
android:configChanges="keyboardHidden|orientation"
이상해 보이지만 그것이 당신의 onConfigurationChanged()
방법에 전달하는 것은 당신이 하나를 제공하지 않으면 레이아웃을 다시 측정하는 것 외에는 아무것도하지 않습니다. 이는 대부분의 시간 동안 회전을 처리하는 완벽하게 적절한 방법 인 것 같습니다 .
답변
code.google.com/p/shelvesAsyncTask
에서 s 및 방향 변경을 처리하는 방법을 확인할 수 있습니다 . 이를 수행하는 방법에는 여러 가지가 있습니다.이 앱에서 선택한 방법은 현재 실행중인 작업을 취소하고 상태를 저장하고 새 작업 이 생성 될 때 저장된 상태로 새 작업을 시작하는 것입니다. 쉽게 할 수 있고 잘 작동하며 사용자가 앱을 떠날 때 작업을 중지하는 데 도움이됩니다.Activity
당신은 또한 onRetainNonConfigurationInstance()
당신 AsyncTask
을 새로운 것에 전달할 수 있습니다 Activity
( Activity
이 방법으로 이전을 유출하지 않도록 조심하십시오 .)
답변
이것은 내가 안드로이드와 관련하여 본 가장 흥미로운 질문입니다 !!! 사실 저는 지난 몇 달 동안 이미 해결책을 찾고있었습니다. 아직 해결되지 않았습니다.
조심하세요.
android:configChanges="keyboardHidden|orientation"
물건으로는 충분하지 않습니다.
AsyncTask가 실행되는 동안 사용자가 전화를받는 경우를 고려하십시오. 요청이 이미 서버에서 처리 중이므로 AsyncTask가 응답을 기다리고 있습니다. 이 순간에는 전화 앱이 포 그라운드로 들어 왔기 때문에 앱이 백그라운드로 전환됩니다. OS는 백그라운드에 있기 때문에 활동을 종료 할 수 있습니다.
답변
Android에서 제공하는 Singleton에서 현재 AsyncTask에 대한 참조를 항상 유지하지 않는 이유는 무엇입니까?
태스크가 시작될 때마다 PreExecute 또는 빌더에서 다음을 정의합니다.
((Application) getApplication()).setCurrentTask(asyncTask);
완료 될 때마다 null로 설정합니다.
이렇게하면 항상 특정 논리에 적합한 onCreate 또는 onResume과 같은 작업을 수행 할 수있는 참조가 있습니다.
this.asyncTaskReference = ((Application) getApplication()).getCurrentTask();
null이면 현재 실행중인 항목이 없음을 알 수 있습니다!
🙂
답변
가장 적절한 방법은 조각을 사용하여 회전 동안 비동기 작업의 인스턴스를 유지하는 것입니다.
다음은이 기술을 앱에 쉽게 통합 할 수있는 매우 간단한 예제에 대한 링크입니다.