2012-07-18 70 views
0

我想要從調用AsyncTask執行的方法返回一個布爾值,如果爲了查找它是否完成而執行。以前我調用了.get()方法(這很好),但是這會暫停所有線程,我想要一個進度對話框。AsynTask確定何時完成

我玩弄了一個for循環的想法,每100ms睡眠/等待,然後檢查getStatus()以查看它是否等於Status.FINISHED,但這似乎是一個糟糕的主意。

下面是代碼的一小部分。

jData.theTask.execute(url); 


    if(jData.theTask.getStatus() == AsyncTask.Status.FINISHED) { 
     if(!WebService.webServiceValid()) { 
      showMessage(); 
      return false; 
     } 

     return true; 
    } 


    Log.d("fired", "false fired"); 
    return false; 

的操作不會是瞬間完成,所以它只是返回false和競爭狀態是由於操作尚未完成的發生。如上所述,我可以將它封裝在for循環中以定期檢查x次,但我確定有可能有更好的解決方案。

非常感謝

編輯:

似乎調用.execute()則獲得()實際上允許UI產卵我的進度對話框,同時等待。獲得布爾(長超時,TimeUnit timeUnit)。這是解決我的問題的方法,但是我會讓問題一直公開,直到明天再有人對此發表評論。

+0

它是一個非常糟糕的做法是使用AsyncTask.get()。你實際上犧牲了AsyncTask的好處並且使得UI線程被阻塞並等待工作線程,因此不再是異步的。更糟糕的是,應用程序可能會拋出ApplicationNotRespondingException。你應該重構你的代碼並在onPostExecute()回調方法中實現你需要的所有東西。 – yorkw 2012-07-19 01:52:33

回答

1

知道AsyncTask是否完成的最適合的地方是方法onPostExecute,該方法在執行doInBackground()之後調用。你可以做的是根據你的後臺活動的執行情況從doInBackground()返回一個Boolean變量。當控件達到onPostExecute()時,可以確保您的後臺活動已完成。

您使用AsyncTask的方式是不合適的,因爲在撥打對象AsyncTask對象後,控制權返回到下一行代碼。

+0

感謝您的回覆,是的,我使用OnPostExecute()來關閉我的ProgressDialog,我也返回一個布爾值,它只是從實際的Async對象中檢查完成。我可以調用.execute()然後.get()作爲布爾值,但是調用者線程仍然會被阻塞,所以沒有對話框。 – Ash 2012-07-18 13:28:25

0

如果移動(jData.theTask.getStatus()== AsyncTask.Status.FINISHED){}塊到內onPostExecute的)中的內容(