可调用阻止UI

时间:2013-12-21 18:56:17

标签: java android multithreading callable

我一直在使用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();
}

我错过了什么?

1 个答案:

答案 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是什么;如果它不是线程安全的,你会想要同步它。