2012-10-29 3 views
2

나는 안드로이드 응용 프로그램을 다운로드하는 파일이 있습니다. 사용자가 listview items.It을 클릭하면 파일이 다운로드됩니다. 잘 작동합니다. 이제 사용자가 다른 항목을 누르고 다른 다운로드가 이미 진행 중이고 다운로드 작업을 취소하기 전에 사용자 확인을 표시하면서 현재 파일 다운로드를 취소하고 다음 파일을 시작하고 싶습니다.AsyncTask의 현재 인스턴스를 취소하고 새 인스턴스를 시작하는 방법?

어떻게하면됩니까? 간단히

+0

용액 http://stackoverflow.com/questions/4748964/android-cancel-asynctask-forcefully –

+0

는 preExecute ('boolean'에 넣어)와 그 값을 확인 여기에있다. –

답변

4

먼저 더 나은 구현 한 번 봐 가지고, 당신은 당신이 취소하려고 할 때마다, 그냥 수동으로 AsyncTask을 취소하여 activiy에 AsyncTask

// in doInBackground, check if asynctask is canceled manually 
if (isCancelled()) break; 

에 확인해야 물론 다른 파일을 다운로드하기 위해 새 파일을 시작하십시오!

mDownloadingTask.cancel(true); 
1

사전에

덕분에, 당신은 변수에 AsyncTask를 저장 :이 작업을 중지하고 시작하려는

mDownloadingTask = new Asynctask(){...}; 
mDownloadingTask.execute(); 

새로운 하나를

//close the current task if it # null 
mDownloadingTask.cancel(true); 
mDownloadingTask = null; 
//Start new one 
mDownloadingTask = new Asynctask(){...}; 
mDownloadingTask.execute(); 
+0

이것이 백그라운드 프로세스를 확실히 끝내시겠습니까? –

+0

번호. 실제로 플래그는 isCanceled 플래그를 true로 설정합니다. doInbackground() 및 onPostExecute()의 2 가지 메소드에서이 플래그를 점검하여 모든 조치를 사용 불가능하게해야합니다. –

+0

그게 내가 원하는 걸, 당신이 완료해야 대답에 이것을 추가해야합니다. –

0

Cancel(false)가를 설정 플래그는 doInBackGround()에서 확인할 수 있으며 코드가 그 일을하는 것을 중지 할 수 있습니다. cancel(true)은 스레드를 인터럽트하는 것을 제외하고는 똑같습니다. 인터럽트에 대한 자세한 정보는 here을 참조하십시오.

작업에 반복 코드가 있으면이 모든 것이 좋습니다. 루프 반복마다 isCancelled()을 확인할 수 있습니다.

당신의 질문과 같이, 파일 다운로드와 같은 일부 작업은 루프를 사용하지 않습니다. 아마도 외부 API 메소드를 호출하는 것일 수 있습니다. 여기서는이 블로킹 메소드를 사용하고 있습니다. 잘 설계되고 있으면 (자), 인터럽트가 발생했을 때에 예외가 슬로우되어 thread가 종료합니다. 또한

SafeAsyncTask

관련 문제