gpt4 book ai didi

java - 可调用阻塞 UI

转载 作者:行者123 更新时间:2023-11-30 03:12:27 25 4
gpt4 key购买 nike

我一直在使用 Jsoup 下载和解析网页,以在列表中显示内容。这个过程需要一段时间,所以我实现了 Callable接口(interface)在另一个线程中执行任务并取回结果。问题是在这个过程中它仍然会阻塞 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 标签。你在这里重新发明轮子。安卓提供AsyncTask对于这个用例。请参阅 Processes and Threads 下的 AsyncTask 示例有关其工作原理的示例。

(后面是原始答案)


您需要您的 Callable 来在完成时更新/通知 UI。一种可能的方法是将对您提到的列表的引用传递给您的 Callable

编辑以从评论中添加:

现在,您将 Callable 提交到池中。然后你坐在那里等待它完成(阻塞 UI 线程)。然后你这样做:

lvListaNotizie.setAdapter(new RiempiLista(activity, notizie));

通过构造函数将 lvListaNotizie 传递给您的 GetListaNotizie 并在 call() 结束时发生,而不是将列表返回给 future 。我不知道 lvListaNotizie 是什么;如果它不是线程安全的,您将需要对其进行同步。

关于java - 可调用阻塞 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20722398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com