2014-02-21 63 views
0

我正面臨我的AsyncTask有點問題。 我以這種方式運行的AsyncTask:AsyncTask不會收到取消

myTask = new myTask(); 

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
       @Override 
       public boolean onQueryTextSubmit(String s) { 
        // same as onquerychange 
        return true; 
       } 

       @Override 
       public boolean onQueryTextChange(String s) { 
        if (!s.isEmpty()) { 
         if (myTask.getStatus() == AsyncTask.Status.RUNNING || 
           myTask.getStatus() == AsyncTask.Status.PENDING) { 
          myTask.cancel(true); 
         } 
         myTask.execute(context, s); 
        } else { 
         myTask.execute(context, "emptyquery"); 
        } 
        return true; 
       } 
      }); 

一旦我輸入第二個字母我不斷收到:java.lang.IllegalStateException:不能執行任務:任務已經執行(一個任務可以只執行一次)

所以我認爲它不會被取消。有什麼建議麼?謝謝

+1

您正在調用多次asynctask – Raghunandan

+0

無需取消線程 – QuokMoon

+0

我看到了,但我打電話給myTask.cancel! – iGio90

回答

2

您不能多次執行相同的AsyncTask。您必須在每次執行之前將其實例化,例如:

myTask = new myTask(); 
myTask.execute(context, s); 

當然,您可以在開始時刪除初始化。

對於停止和重新啓動,使用:

myTaks.cancel(true); 
myTask = new myTask(); 
myTask.execute(context, s); 

即使你取消AsyncTask,你不能再使用它。

+0

是的,我知道,但我只想執行一次任務...所以,如果例如我在我的搜索欄中鍵入快速:a - b - c - d我將有4個正在運行的任務...我只想要一個在最後的搜索查詢!可能? – iGio90

+0

編輯我的答案。 –

+0

讓我們試試吧!謝謝! – iGio90

2

當您撥打myTask.cancel();時,AsyncTask嘗試停止該線程。給力的是,你可以檢查任務已經取消了:

if(isCancelled()){ 
    return null; 
} 

doInBackground內,自己阻止它。否則,在調用onPostExecute之前,已經檢查了AsyncTask的狀態。通過這種方式,如果您撥打cancel(),您確定沒有返回任何值。檢查文檔在這裏:AsyncTask

無論如何:一個AsyncTask只能執行一次。如果必須再次運行,則必須實例化另一個AsyncTask。