2016-08-08 187 views
1

我正在運行一個AsyncTask,它需要一些時間來加載。在那段時間裏,如果我按回按鈕,那麼它就不會迴應。它只在幾秒鐘後響應。那麼如何殺死或暫停或覆蓋AsyncTask回去?或者有沒有其他方法可以做類似的事情?當按下後退按鈕時,如何停止android中的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()

public void onBackPressed() { 
    super.onBackPressed(); 
    asyncTask.cancel(true); 
    finish(); 
} 
+0

發佈您的代碼? –

+0

我是這個平臺的新手。你能告訴我,我如何發佈代碼?它在發佈時顯示錯誤。 –

+0

將您的代碼複製並粘貼到編輯框中,在編輯框中選擇所有代碼,然後按Ctrl + K進行格式化。然後提交它。 –

回答

2

也沒有辦法,你可以停止asynch task instantly。每AsynchTask具有與之相關聯的boolean flag property所以如果cancel_flag =True平均任務已被取消,並且有一個cancel()函數可以在01上調用這樣

loginTask.cancel(true);

但是這一切都取消()函數,它會設定一個取消非同步任務的boolean(flag)財產True所以,你可以用isCancelled()功能檢查該物業內doInBackGround,做一些事情,像

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

,如果它是真實的,那麼你可以使用break the loops(如果你正在做一個長期的任務)或return迅速走出去的doInBackground和呼叫cancel() on asynchtask將跳過執行onPostExecute()

另一種選擇是,如果你想在後臺停止多個運行異步任務,那麼調用每個任務的取消操作可能會很繁瑣,所以在這種情況下,你可以在container class(of asynchtask)有一個布爾標誌並跳過asynchtask標誌已設置爲True,像

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

但一定要也把支票onpostExecute在這種情況下,因爲它不會停止onPOST等的執行。

0

您可以立即停止呼叫asyncTask.cancel(true)

但不建議這樣做,因爲它可能導致內存泄漏。最好撥打asyncTask.cancel(false)並退出doInBackground功能,手動檢查isCancelled()值爲@Pavneet建議。

相關問題