2016-08-08 3 views
1

나는 AsyncTask을 실행 중입니다.로드하는 데 약간의 시간이 걸립니다. 그 기간 동안, 버튼을 다시 누르면 응답하지 않습니다. 몇 초 후에 만 ​​반응합니다. 그렇다면 어떻게하면 AsyncTask을 죽이거나 일시 중지하거나 무시할 수 있습니까? 아니면 비슷한 것을 할 수있는 다른 방법이 있습니까?뒤로 버튼을 누르면 안드로이드에서 asynctask를 멈추는 방법은 무엇입니까?

if (mainContent != null) { 
    mainContent.post(new Runnable() { 
     @Override 
     public void run() { 
      Bitmap bmp = Utilities.getBitmapFromView(mainContent); 
      BlurFilter blurFilter = new BlurFilter(); 
      Bitmap blurredBitmap = blurFilter.fastblur(bmp,1,65); 
      asyncTask = new ConvertViews(blurredBitmap); 
      asyncTask.execute(); 
     } 
    }); 

AsyncTask :

class ConvertViews extends AsyncTask<Void,Void,Void> { 
     private Bitmap bmp; 

     public ConvertViews(Bitmap bmp){ 
      this.bmp = bmp; 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       //Thread.sleep(200); 
       if(mainViewDrawable == null) { 
        mainViewDrawable = new BitmapDrawable(getResources(), bmp); 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    } 

onBackPressed() :

당신이 asynch task instantly .Every AsynchTask을 중지 할 수있는 방법이 없습니다되어
public void onBackPressed() { 
    super.onBackPressed(); 
    asyncTask.cancel(true); 
    finish(); 
} 
+0

코드를 게시 하시겠습니까? –

+0

이 플랫폼을 처음 사용합니다. 코드를 게시하려면 어떻게해야합니까? 게시하는 동안 오류가 표시됩니다. –

+0

코드를 복사하여 편집 상자에 붙여넣고 편집 상자에서 코드를 모두 선택하고 Ctrl + K를 눌러 포맷하십시오. 그런 다음 제출하십시오. –

답변

2

그와 관련된 boolean flag property 평균 cancel_flag =True을 만약 그렇다면 작업이 취소되었으며 01에서 호출 할 수있는 cancel() 함수가 있습니다. 이

loginTask.cancel(true);

하지만이 모든 취소와 같은() 함수는 doInBackGround 내부 isCancelled() 기능이 속성을 확인하고 뭔가를 할 수 있습니다, 그것은 그렇게 True에 비동기 작업의 boolean(flag) 속성을 취소 설정합니다입니다 않습니다, 이 True 인 경우 같은

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

다음은 break the loops (당신이 긴 작업을 수행하는 경우) 또는 returndoInBackground와 통화에서 빠르게 이동하는 데 사용할 수있는 cancel() on asynchtask을 실행하면 onPostExecute()의 실행을 건너 뜁니다.

당신은 당신이 container class(of asynchtask)에서 부울 플래그를 가지고 있고 경우 asynchtask 내부 작업을 생략 할 수 있습니다이 경우에, 그래서 지루한 될 수있는 각 하나를 취소 호출 한 후 백그라운드에서 실행중인 여러 비동기 작업을 중지하려면 다른 옵션이다 플래그는

protected Object doInBackground(Object... x) { 
    while (/* condition */) { 
     // work... 
     if (container_asynch_running_flag) break; 
    } 
    return null; 
} 

처럼 True로 설정하지만 onpost의 실행을 중지하지 않기 때문에이 경우에 onpostExecute에 체크를 넣어 확인되었습니다.

0

즉시 중지하여 asyncTask.cancel(true)을 호출 할 수 있습니다.

그러나 메모리 누수가 발생할 수 있으므로 수행하지 않는 것이 좋습니다. asyncTask.cancel(false)을 호출하고 @Pavneet가 권고 한대로 수동으로 isCancelled() 값을 검사하여 doInBackground 함수를 종료하는 것이 더 좋습니다.

관련 문제