【发布时间】:2014-03-18 17:38:25
【问题描述】:
我是线程新手。我搜索了许多与我的问题相关的问题,但我无法找到适合我的解决方案。我正在做的是使用 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);
我希望调用是并行的,以节省获取数据的时间。现在的想法是我希望所有四个线程都完成工作,然后我想根据时间戳显示排序的数据。现在的问题是我的 setAdapter 在四个线程完成获取数据之前被调用,因为适配器是在 UI 线程上设置的。我想要一种机制来阻止 UI 线程,直到所有四个线程都完成获取数据。
我发现也许我可以使用 ExecutorService 的 shutdown() 和 awaitTermination() 方法。无论如何,如果有人可以帮助我,那就太好了。非常感谢
【问题讨论】:
-
你是对的。关闭或等待终止。如果要创建许多线程,您还可以扩展线程类并创建自己的线程消息传递并重用相同的线程。也许 java 使用持久线程优化线程创建以避免创建开销,因此使用执行器也可以通过 awaitTermination 来提高效率。
-
如果我理解正确,AsyncTask 的 onPostExecute(Result) 应该可以解决您的问题。一旦 AsyncTask 完成,它就会在 UI 线程上调用 onPostExecute。您可以记录所有任务是否已完成,一旦完成,您可以在 onPostExecute(Result) 函数的列表视图中设置适配器。
-
是的,我做了类似的实现。谢谢你的帮助:)
标签: java android multithreading threadpool