我是线程新手。我搜索了许多与我的问题相关的问题,但无法找到适合我的解决方案。我正在做的是使用四个异步任务使用 THREAD_POOL_EXECUTOR 从四个不同的社交媒体获取数据。 代码如下。
new Fb().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new Twitter().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
...
mAdapter = new MyAdapter(getActivity(),
(ArrayList<Model>) showList);
mListView.setAdapter(mAdapter);
我希望并行调用以节省获取数据的时间。现在的想法是,我希望所有四个线程完成工作,然后我想根据时间戳显示排序的数据。现在的问题是,当在 UI 线程上设置适配器时,我的 setAdapter 在四个线程完成数据获取之前被调用。我想要一种机制来阻止 UI 线程,直到所有四个线程完成数据获取。
我发现也许我可以使用 ExecutorService 的 shutdown() 和 waitTermination() 方法。无论如何,如果有人能帮助我,那就太好了。非常感谢
最佳答案
我会做的是:
- 在您的 Activity 中创建一个空的 ArrayList
- 将此 arrayList 传递给您的适配器并在 ListView 上设置适配器。 setAdapter 方法不会影响 listView - 它仍然是空的,因为列表为空。
- 启动 4 个异步任务并获取数据。在 onPostExecute() 中将此数据添加到 ArrayList 并在适配器上调用 notificationDatasetChanged()。
您永远不应该阻塞 UI 线程,因为这是错误的。当您希望一次显示所有数据时,您可以创建一个简单的计数器,在每个 onPostExecute 中创建 counter++ 并仅在计数器为 4 时调用 notificationDatasetChange() 。
关于java - 等待线程池完成执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21862725/