android - wait 안드로이드 활동이 파괴 된 경우에도 AsyncTask가 중지되지 않습니다.




3 Answers

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

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

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

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

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

안드로이드 asynctask generic

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