我是线程新手。我搜索了许多与我的问题相关的问题,但我无法为我找到合适的解决方案。我正在做的是我使用四个异步任务使用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()方法。如果有人能帮助我,那将是很棒的。非常感谢
答案 0 :(得分:1)
我要做的是:
你永远不应该阻止UI线程,因为它是错误的。如果希望一次显示所有数据,可以创建一个简单的计数器,在每个onPostExecute中创建counter ++,并仅在counter为4时调用notifyDatasetChange()。
答案 1 :(得分:0)
从 ExecutorService 调用方法关闭()。
启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html
答案 2 :(得分:0)
如果你真的可以阻止UI线程,试试这个:
new Fb().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new Twitter().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
...
AsyncTask.THREAD_POOL_EXECUTOR.shutdown();
while (!AsyncTask.THREAD_POOL_EXECUTOR.isTerminated()) {}
mAdapter = new MyAdapter(getActivity(),
(ArrayList<Model>) showList);
mListView.setAdapter(mAdapter);
在大多数情况下,阻止UI线程不是一个好主意。
答案 3 :(得分:0)
我可以成功处理问题而无需深入了解线程。我使用了在执行每个线程后使布尔值成为真的简单概念。在UI线程中,我检查了infinte时间,即
while(true)
{
if(flag1 && flag2 && flag3 && flag4)
{
//set the adapter and make the flags false
break;
}
}
不要忘记将falgs弄错,否则执行将无限期地继续。