2017-06-07 86 views
1

AsyncTask在調用方法new myTask.cancel()後仍然運行。當我按下後退按鈕時,或者當我用微調器更改片段時,我會調用該方法。我記錄了增量的進度,甚至在調用myTask.cancel之後,增量仍然上升。AsyncTask仍然在方法(.cancel)後運行

我的AsyncTask類

public class myTask extends AsyncTask<Void, Integer, String> { 
     private static final String TAG = "myTask"; 
     private ProgressBar budgetProgressBar=null; 
     private TextView textView1; 
     double b_val,e_val; 
     int position; 
     private Context mContext; 

     public myTask(){ 
     } 


     public myTask(double b_val ,double e_val,ProgressBar budgetProgressBar, TextView textView1) { 
      this.b_val = b_val; 
      this.textView1=textView1; 
      this.e_val = e_val; 
      pStatus = (int) e_val; 
      this.budgetProgressBar= budgetProgressBar; 
      position = (int) budgetProgressBar.getTag(); 
      maxBudget = (int) this.b_val; 
     } 


     int pStatus; 
     int maxBudget; 


     @Override 
     protected void onPreExecute() { 
      budgetProgressBar.setMax(maxBudget); 
      budgetProgressBar.setVisibility(View.VISIBLE); 

       budgetProgressBar.getProgressDrawable().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN); 
    //  } 
     } 

     @Override 
     protected String doInBackground(Void... params) { 

      int incrementor =10; 


       for (int i = incrementor; i<=pStatus && !isCancelled(); i+=incrementor){ 

        if (isCancelled()){ 
         Log.d(TAG, "doInBackground: CANCELLED"); 
         break; 
        } 

        try { 

         Thread.sleep(10); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 

        publishProgress(i); 
       } 


      return "Complete"; 
     } 


     @Override 
     protected void onProgressUpdate(Integer... p) { 

      super.onProgressUpdate(p); 
      Log.d(TAG, "onProgressUpdate: "); 
      if ((int) budgetProgressBar.getTag() == position){ 
       budgetProgressBar.incrementProgressBy(p[0]); 
       budgetProgressBar.setProgress(p[0]); 
       textView1.setText(p[0]+"/"+maxBudget); 
       // Log.d(TAG, "Setting progress to " + p[0]); 

       double calc =(e_val/b_val)*100; 
       if (calc>100){ 
        calc-=100; 
        textView1.setText("-"+ ((int) calc)+"%"); 
       }else{ 
        textView1.setText(((int) calc)+"%"); 
       } 

      } 

     } 





    } 

取消的AsyncTask

new myTask().cancel(true); 
+0

可能會幫助你:https://stackoverflow.com/a/6053943/423980 – mt0s

+0

我假設你不通過'new myTask()取消它,取消(true);'雖然,但取而代之的是取消正在運行的實例。 –

回答

4

的AsyncTask的理解的AsyncTask#cancel甚至沒有停止doInBackground任務如果方法名稱暗示爲那樣。結果是doInBackground將運行到結束,它將最終調用onCancel而不是onPostExecute

所以,你可能想揮發性場標誌添加到AsyncTask並設置爲取消例如

AsyncTask 
private volatile boolean isRunning = true; 

public void cancelTask() // sets isRunning to false 

而且你會檢查isRunning而不是isCancelled()

+0

所以'doInBackground'任務不能以編程方式停止運行? –

+0

@Fritz_Playmaker它可以。查看我答案的第二部分,並用'if(isRunning)'替換當前的'if(isCancelled())' –

相關問題