我一直在使用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();
}
我错过了什么?
答案 0 :(得分:1)
因为...您正在向池中提交Callable
,然后明确阻止线程等待它完成。
ArrayList<Notizia> notizie = task.get();
我错过了Q 上的Android代码。你在这里重新发明轮子。 Android为此用例提供了AsyncTask
。有关其工作原理的示例,请参阅Processes and Threads下的AsyncTask示例。
(原始答案如下)
您需要Callable
在完成后更新/通知用户界面。一种可能的方法是将您提到的列表的引用传递给Callable
。
编辑以添加评论:
现在,您将Callable
提交到池中。然后你坐在那里等待它完成(阻止UI线程)。然后你这样做:
lvListaNotizie.setAdapter(new RiempiLista(activity, notizie));
通过构造函数将lvListaNotizie
传递给GetListaNotizie
,并在call()
的末尾发生,而不是将列表返回到Future
。我不知道lvListaNotizie
是什么;如果它不是线程安全的,你会想要同步它。