2013-03-24 62 views
0

我使用這個例子停止問題:苦苦尋找與原因的AsyncTask沒有被處理程序

Android - Setting a Timeout for an AsyncTask?

通過以下方式

al.setOnClickListener(new OnClickListener(){ 
     public void onClick(View w) 
     { 
      final AlogLoader loader = new AlogLoader(); 
      loader.execute(); 
      Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() 
      { 
       public void run() 
       { 
        if(loader.getStatus() == AsyncTask.Status.RUNNING) 
        { 
         loader.cancel(true); 
        } 
       } 

      }, 1);  
     } 
    }); 

我將它設置爲「1」因爲我想看看我是否可以在開始之前實際阻止它 - 看看我的處理程序是否正在工作 - 實際上我可能會將其設置爲15000(15秒)。

但是發生的事情是令人困惑:

運行應用程序,使我onPreExecute()來繪製一個加載屏幕,這並不永遠退出,因此用戶只看到一個載入畫面永遠。

在調試器中使用loader.cancel中的斷點運行它(true) - >導致調試器停在該行,這是預期的,因爲它只允許運行1毫秒。但是,當我在調試器中點擊恢復按鈕後 - 我的onPostExecute()被調用... 這怎麼可能?

很顯然,我很新的超時asynctasks - 經過一番研究,我發現上面的例子中,它似乎最有意義給我,肯定更然後 loader.get(15000,TimeUnit.MILLISECONDS ),因爲那阻止了UI線程。

任何幫助表示讚賞...甚至在處理的說明..

回答

0

好吧, 所以我基本上解決了我的問題,但我仍然困惑...不知道如果這一切都很好。

我不清楚loader.cancel(true)是如何工作的。根據API級別(閱讀此問題:AsyncTask.onCancelled() not being called after cancel(true)),您需要在AsyncTask中具有onCancelled()或onCancelled(params)方法或兩者。

我沒有這個,所以這解釋了爲什麼我永遠看到加載屏幕。好的。

然而,它並沒有解釋如何在調試器中,我設法仍然調用onPostExecute(),因爲根據Android的API的,onPostExecute不會被調用一次取消(真)被稱爲...

答案是: 添加到您的AsyncTask-

@Override 
    protected void onCancelled() 
    { 
     Toast.makeText(FriendsActivity.this,"Blah- reason", Toast.LENGTH_LONG).show(); 
     loadingScreen.dismiss(); 
    }