[android] 안드로이드 - 강제로 AsyncTask 취소



Answers

AsyncTask 에서 cancel() 을 호출하십시오. 이것이 실제로 어떤 것을 취소할지 여부는 여러분이하는 일에 조금 의존적입니다. Romain Guy의 말을 인용하자면 :

취소 (true)를 호출하면 인터럽트가 백그라운드 스레드로 보내져 인터럽트 가능한 작업을 도울 수 있습니다. 그렇지 않으면 doInBackground () 메소드에서 isCancelled ()를 정기적으로 확인해야합니다. code.google.com/p/shelves에서 예를 확인할 수 있습니다.

Question

내 활동에서 AsyncTask를 구현했습니다.

 performBackgroundTask asyncTask = new performBackgroundTask();
 asyncTask.execute();

이제 "취소"버튼 기능을 구현해야하므로 실행중인 작업의 실행을 중지해야합니다. 실행중인 작업 (백그라운드 작업)을 어떻게 중지 시킬지 모르겠습니다.

그래서 제발 제안 해주세요, AsyncTask를 강제로 취소하는 방법은 무엇입니까?

최신 정보:

같은 Cancel() 메서드는 Cancel() 에 대해 발견하지만 cancel(boolean mayInterruptIfRunning) 호출 cancel(boolean mayInterruptIfRunning) 반드시 백그라운드 프로세스의 실행을 중지하지 않는 것으로 나타났습니다. 일어나는 모든 일은 AsyncTask가 onCancelled ()를 실행하고 완료되면 onPostExecute ()를 실행하지 않는다는 것입니다.




우리의 글로벌 AsyncTask 클래스 변수

LongOperation LongOperationOdeme = new LongOperation();

AsyncTask를 인터럽트하는 KEYCODE_BACK 동작

   @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            LongOperationOdeme.cancel(true);
        }
        return super.onKeyDown(keyCode, event);
    }

그것은 나를 위해 작동합니다.




isCancelled() always returns false even i call asynctask.cancel(true); 주석 케이스에 언급 된 isCancelled() always returns false even i call asynctask.cancel(true); 내 응용 프로그램을 닫으면 특히 유해하지만 AsyncTask는 계속 작동합니다.

이를 해결하기 위해 Jacob Nordfalk 코드가 제안한 방법을 다음과 같이 수정했습니다.

protected Object doInBackground(Object... x) {
    while (/* condition */) {
      // work...
      if (isCancelled() || (FlagCancelled == true)) break;
    }
    return null;
 }

주 활동에 다음을 추가했습니다.

@Override
protected void onStop() {
    FlagCancelled = true;
    super.onStop();
}

AsyncTask는 뷰 중 하나의 private 클래스이므로 AsyncTask에 현재 실제 플래그 값을 알리려면 getter 또는 setter가 필요합니다.

여러 번의 테스트 (AVD Android 4.2.2, Api 17)에서는 AsyncTask가 doInBackground 이미 실행하고있는 경우 isCancelled() mViewGroup.removeAllViews(); 취소하려는 시도에 전혀 반응하지 않습니다 (즉, false가 mViewGroup.removeAllViews(); 또는 MainActivityOnDestroy 동안, 각각은보기의 분리로 이어진다.

   @Override 
   protected  void  onDetachedFromWindow() { 
    mAsyncTask.cancel(false); // and the same result with mAsyncTask.cancel(true);
    super.onDetachedFromWindow(); 
   } 

도입 된 FlagCancelled 덕분에 doInBackground() 를 강제 FlagCancelled 하면 onPostExecute() 가 호출되지만 onCancelled() 또는 onCancelled(Void result) (API 레벨 11 이후)는 호출되지 않습니다. (나는 왜 호출해야하고 onPostExecute() 호출해서는 안되는 지 알지 못합니다. "안드로이드 API 의사는 cancel () 메소드를 호출하면 onPostExecute (Object)가 호출되지 않는다는 것을 보증합니다."- IdleSun , 비슷한 질문에 답변 ) .

반면에, 같은 AsyncTask가 취소하기 전에 doInBackground() 를 시작하지 않았다면, 모든 것은 괜찮습니다. isCancelled() 는 true로 변경되고,

@Override
    protected void onCancelled() {
        Log.d(TAG, String.format("mAsyncTask - onCancelled: isCancelled = %b, FlagCancelled = %b", this.isCancelled(), FlagCancelled ));
    super.onCancelled();
}



Related