处理单个进度对话框与并行多个异步任务

3
在我的项目中,我希望在页面加载时同时从3个不同的URL(Web服务)并行加载数据。
为此,我使用了3个不同的异步任务来加载数据。
当第一个异步任务启动时,我想显示进度对话框消息为“正在加载”,并在完成最后一个异步任务后关闭对话框(在完成3个任务之前显示进度对话框)。
请告诉我如何处理这种情况。
3个回答

4

处理这种情况有不同的方法。

  1. 您可以使用一个计数器变量,该变量初始化为任务数量。当一个 AsyncTask 完成时,此计数器会递减。当计数器为 0 时,ProgressDialog 将被关闭。您可以在每个 AysncTaskonPostExecute 中实现此递减和检查以关闭进度对话框。

  2. 您可能不需要 3 个不同的 AsyncTask。您可以使用单个 AsyncTask 并使用 CountDownLatch 进行线程同步。


谢谢你,Rajesh。我会用你的逻辑成功的。我在活动中创建了一个全局变量,在postexecute()中每次增加值,并且当值达到“3”时检查并关闭对话框。 - Krishna Prasad

1
一种方法是创建一个接口OnThreadFinishListener(带有onThreadFinish()方法),并让您的活动实现它。所有的AsyncTask都应该向侦听器注册自己,这样每次线程完成时它都会调用onThreadFinish方法。在onThreadFinish方法中,它应该检查后台是否仍有线程正在运行(类似于if (asyncTask1.getStatus() == AsyncTask.Status.RUNNING || asyncTask2.getStatus() == AsyncTask.Status.RUNNING ... ))。
如果全部为false,则可以关闭progress dialog

0
你可以按照以下方式进行:
//define progress dialog object globally in your parent class
ProgressDialog pd = null;

AsyncTask1 onPreExecute:

pd = ProgressDialog.show(this, "title", "loading", true);

异步任务2:

//do nothing

AsyncTask3 onPostExecute:
if(pd!=null)
    pd.dismiss();

1
谢谢您的回答,但我们不能期望哪个异步任务最后加载。 - Krishna Prasad
你不是在第一个任务的onPostExecute中启动第二个任务吗? - waqaslam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接