2011-12-22 56 views
1

只是想知道做什麼用冰淇淋三明治發生了......onCancelled()似乎目前存在的在冰淇淋三明治

我從一臺服務器有一個簡單的AsyncTask讀取數據。當斷開按鈕被點擊時,然後調用lServerTask.cancel(true);,它已成功呼叫onCancelled(),設置m_Running = false;因此突破protected void doInBackground(Void...params)中的while循環。

使用我的Galaxy Nexus,我單擊斷開按鈕,但任務不會退出。並且仍然連接到服務器。有沒有人有任何想法?

非常感謝

馬克

代碼僅供參考 -

 // automatically done on worker thread (separate from UI thread) 
    protected Void doInBackground(Void...params) 
    { 
     while(m_Running) 
     { 
      try 
      { 
       lRDS.readSocket(); 
      } 
      catch (IOException e) 
      { 
       lRDS.disconnectFromServer(); 
       publishProgress(e.toString()); 
       return null; 
      } 

      lDataBuffer = lRDS.getDataBuffer();  

      publishProgress(lDataBuffer); 

     } 
     return null; 
    } 

    @Override 
    protected void onCancelled() 
    { 
     m_Running = false; 
     connectRDSButton.setEnabled(true); 
     disconnectRDSButton.setEnabled(false); 
    } 

,並從UI方面:

private class disconnectRDSButtonHandler implements View.OnClickListener 
{   
    public void onClick(View v) 
    {    
     editRobotData.setText("Disconnect..."); 
     if (lRobotDataServerTask.cancel(true) == true) 
     { 
      editRobotData.setText("Disconnected...");     
     } 
    }   
} 
+0

請將您的更新作爲實際答案發布,然後接受您自己的答案。 – 2012-02-06 17:32:06

回答

0

好吧,看來我已經找到了問題。我需要在doInBackground()方法的while循環中檢查isCancelled(),然後從那裏調用onCancelled()方法。不知道爲什麼我沒有看到這是HTC的願望在Android 2.2上的問題。

protected Void doInBackground(Void...params) 

{ 

while(m_Running) 
{ 
    if (isCancelled() == true) 
    { 
     onCancelled(); 
    } 

希望這可以幫助別人。

馬克

+0

這不是問題。你不需要手動調用onCancelled,API會爲你做(只要主線程仍在運行)。查看我的答案以獲得更長的解釋。 – 2012-09-28 08:23:40

0

有取消的AsyncTask兩種方法:

  • 檢查isCancelleddoInBackground方法內,試圖儘快結束。
  • 調用cancel(true),則AsyncTask的後臺線程將被中斷。爲此,您需要策略性地將Thread.sleep呼叫置於您的doInBackground方法中,並在您趕上InterruptedException時返回。

這兩種方法中,後者是目前爲止最不可靠的,因爲一種方法的任何呼叫捕捉一個InterruptedException其他比你將螺釘的取消。例如,如果你調用一個方法如SystemClock.sleep來吞噬異常,那麼你將永遠不會碰到你的catch子句。

在這兩種情況下,在isCancelled支票或Thread.sleep調用之間的長期操作將運行至完成。

現在關於你的問題,你使用第二種方法,但沒有任何Thread.sleep調用,所以它不會工作,除非你調用的某些方法捕獲中斷異常並拋出IOException。從一個版本到另一個版本的實施變化可能會有所不同。

相關問題