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