我正在尝试使用AsyncTask下载字符串并返回字符串。我想使用AsyncTask,因为它可能需要一段时间。
一个问题是我无法在互联网上找到返回任何类型值的AsyncTask的示例。所以我在Commonsware书中拿了这个例子并修改它以返回一个值,我得到的值如下:
String mystr = new AddStringTask().execute().get();
虽然这有效,但似乎这行代码正在等待返回值,因此同步。必须有一些方法可以使用AddStringTask的结果触发事件。
怎么做的? 谢谢,加里
答案 0 :(得分:2)
AsyncTask
无法返回值,因为要获取返回的值,您必须在任务完成之前等待。这会使AsyncTask
毫无意义。
相反,您应该将代码移到onPostExecute()
(在UI线程上运行,如果这是您担心的话)。这是您处理doInBackground()
返回的值的位置,通常会更新UI或显示错误消息。
答案 1 :(得分: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是一个接口,其中一个名为finished的函数在Activity中以与onClickListener相同的方式实现。