2012-09-17 181 views
0

我想使用AsyncTask來下載一個字符串並返回字符串。我想使用AsyncTask,因爲它可能需要一段時間。從AsyncTask獲取結果

一個問題是,在互聯網上無處可以找到一個AsyncTask返回任何類型的值的例子。所以我參加了Commonsware書中的實例,並修改它返回一個值,我得到的值,如下所示:

String mystr = new AddStringTask().execute().get(); 

雖然這個工作,它似乎是這行代碼是等待返回值,因此同步。必須有一些方法來使用AddStringTask的結果來獲得事件觸發器。

這是怎麼做的? 謝謝,加里

+0

看到這個問題:http://stackoverflow.com/questions/9447646/how-do-i-send-data-back-from-onpostexecute-in-an-asynctask/9447833#9447833 –

回答

2

AsyncTask不能返回一個值,因爲要得到返回的值,你必須等待任務完成之前。那會使AsyncTask毫無意義。

取而代之,您應該將代碼移動到onPostExecute()(如果這是您擔心的問題,則在UI線程上運行)。這是處理由doInBackground()返回的值的位置,通常會更新UI或顯示錯誤消息。

+0

好吧,我想我得到它。 onPostExecute在UI線程上,它與Microsoft WCF世界中的_completed事件類似。 –

+0

另一種從您的活動中獲取結果的方法AsyncTask。 我只是寫在我的博客上,你可以添加它。你可以參考下面的鏈接 http://smartphonebysachin.blogspot.in/2012/11/how-to-return-value-from-async-task-in.html –

0

另外,如果你想實現一個更通用的AsyncTask,你可以實現類似下面的內容來區分你的代碼在活動中。

@Override 
protected void onPostExecute(Bitmap r){ 
    if (r != null) { 
     processListeners(r); 
    } 
} 

protected void processListeners(Object data) { 
    for (final AsyncTaskDone l : listeners) l.finished(data); 
} 

public void addAsyncTaskListener (final AsyncTaskDone l){ 
    listeners.add(l); 
} 

哪裏AsyncTaskListener是所謂的活動完了實現方式的onClickListener是同一功能的接口。

+0

要小心這一點,當涉及到配置更改一個活動。這最好用於像保留片段之類的東西。 – CommonsWare

+0

True - 對於旋轉,最好的解決方案是實現Loader類 –

+0

我不會這麼說,因爲'Loader'框架對ContentProviders只有很好的效果,對其他任何東西都不太好。 – CommonsWare