[android] 활동이 파괴 된 경우에도 AsyncTask가 중지되지 않습니다.



Answers

로맹 가이 맞습니다. 사실 비동기 작업은 어떤 경우에도 자체 작업을 완료하는 책임이 있습니다. 인터럽트가 최선의 방법은 아니므로 누군가가 당신의 작업을 취소하거나 중단하기를 원한다고 계속 확인해야합니다.

AsyncTask 가 루프에서 여러 번 작업을한다고 가정 해 봅시다. 그런 다음 모든 루프에서 isCancelled() 를 검사해야합니다.

while ( true ) {
    if ( isCancelled())
        break;
    doTheTask();
}

doTheTask() 는 실제 작업이고 모든 루프에서 작업하기 전에 작업을 취소해야하는지 확인합니다.

일반적으로 AsyncTask 클래스에 플래그를 설정하거나 doInBackground() 에서 적절한 결과를 반환하여 onPostExecute() 에서 원하는 작업을 완료 할 수 있는지 또는 작업이 중간에 취소되었는지 확인할 수 있도록해야합니다.

Question

Activity가 생성 될 때 실행을 시작하고 백그라운드에서 작업을 수행하는 AsyncTask 객체가 있습니다 (최대 100 개의 이미지 다운로드). 모든 것은 잘 작동하지만 이해할 수없는 이러한 독특한 행동이 있습니다.

예를 들어 : 안드로이드 화면의 방향이 바뀌면 활동이 파괴되고 다시 생성됩니다. 따라서 onRetainNonConfigurationInstance () 메서드를 재정의하고 AsyncTask에서 실행되는 다운로드 한 모든 데이터를 저장합니다. 이 작업을 수행하는 나의 목적은 활동이 삭제 될 때마다 AsyncTask를 실행하지 않도록하는 것입니다. 그러나 오리엔테이션 변경 중에 작성되지만 이전 AsyncTask가 여전히 실행 중임을 로그에서 확인할 수 있습니다. (데이터는 올바르게 저장됩니다.)

액티비티의 onDestroy () 메소드에서 AsyncTask를 취소하려고 시도했지만 로그에 AsyncTask가 실행중인 것으로 표시됩니다.

이것은 정말 이상한 행동이며 누군가가 나에게 AsyncTask를 중지 / 취소하는 올바른 절차를 말할 수 있다면 정말로 감사 할 것입니다.

감사




오리엔테이션 변경시 활동이 재현됩니다. 그렇습니다. 이 이벤트가 발생할 때마다 asynctask를 계속할 수 있습니다.

당신이 그것을 확인해

@Override
protected void onCreate(Bundle savedInstanceState) { 
     if ( savedInstanceState == null ) {
           startAsyncTask()
     } else {
           // ** Do Nothing async task will just continue.
     }
}

-건배




asynctask가 스레드 풀 (병렬 처리)에 없으면 이미 asynctask가 실행 중이므로 중지 할 수 없습니다. 중지 또는 취소 명령은 CPU가 비어있는 후에 실행됩니다 (CPU가 asynctask로 완료 됨). 그러나 스레드 풀에 있으면 작업이 대기열에 들어가고 하나씩 실행됩니다. 따라서 취소 명령이 비동기 작업을 실행하는 동안 대기하면 비동기 작업이 중지 될 수 있습니다.




Related