我一直在下载并使用Jsoup解析一个网页,以在列表中显示内容。这个过程需要一段时间,所以我实现了Callable接口,以便在另一个线程中完成任务并返回结果。问题是它在这个过程中仍然会阻塞UI。
public class GetListaNotizie implements Callable<ArrayList<Notizia>> {
static ArrayList<Notizia> getNotizieBySezione() {
[...] Long process
return notizie;
}
@Override
public ArrayList<Notizia> call() throws Exception {
return getNotizieBySezione();
}
}
然后:
final ExecutorService service;
final Future<ArrayList<Notizia>> task;
service = Executors.newFixedThreadPool(1);
task = service.submit(new GetListaNotizie());
try {
ArrayList<Notizia> notizie = task.get();
lvListaNotizie.setAdapter(new RiempiLista(activity, notizie));
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
我错过了什么?
因为。。。您正在将Callable
提交到池中,然后显式地阻止线程等待它完成。
ArrayList<Notizia> notizie = task.get();
我错过了你Q上的Android标签。你在这里重新发明轮子。Android为这个用例提供了AsyncTask
。有关其工作方式的示例,请参阅"进程和线程"下的AsyncTask示例。
(原始答案如下)
您需要Callable
在UI完成时更新/通知它。一种可能的方法是将您提到的列表的引用传递给Callable
。
编辑以从评论添加:
现在,您将Callable
提交到池中。然后你坐在那里等待它完成(阻塞UI线程)。然后你这样做:
lvListaNotizie.setAdapter(new RiempiLista(activity, notizie));
通过构造函数将lvListaNotizie
传递给GetListaNotizie
,并在call()
的末尾进行,而不是将列表返回给Future
。我不知道lvListaNotizie
是什么;如果它不是线程安全的,你会想在它上同步。
AsyncTask自API级别30起已弃用。
您可以使用异步代码的协同程序文档链接或者您可以使用异步长期运行操作文档链接的工作管理器
现在回答已经太晚了,但可能对新开发人员有用。