【问题标题】:Handle single progressdialog with parallel multiple asynctask使用并行多个异步任务处理单个进度对话框
【发布时间】:2012-05-11 06:39:19
【问题描述】:

在我的项目中,我想在加载页面时从 3 个不同的 url(webservice)并行加载数据。

为此,我使用 3 个不同的异步任务来加载数据。

我想在第一个异步任务启动时将进度对话框消息显示为“正在加载”,并在最后一个异步任务完成后关闭对话框(直到完成 3 个任务显示进度对话框)。

请告诉我如何处理这种情况。

【问题讨论】:

    标签: android android-asynctask progressdialog


    【解决方案1】:

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

    1. 您可以使用使用任务数初始化的计数器变量,当AsyncTask 完成时,此计数器会递减。当计数器为 0 时,ProgressDialog 被解除。您可以在每个AysncTaskonPostExecute 中执行此递减并检查进度对话框关闭。

    2. 您可能不需要 3 个不同的 AsyncTasks。您可以使用单个 AsyncTaskCountDownLatch 进行 Thread 同步。

    【讨论】:

    • 谢谢你 rajesh,我会用你的逻辑获得成功,我在活动中创建一个全局变量,每次我增加 postexecute() 中的值并检查值何时达到“3”我关闭对话框。
    【解决方案2】:

    您可以做的一种方法是创建一个接口OnThreadFinishListener(使用onThreadFinish() 方法)并让您的活动实现它。您的所有AsyncTask 都应将自己注册到侦听器,因此每次线程完成时都会调用onThreadFinish 方法。在 onThreadFinish 方法中,它应该检查是否仍有线程在后台运行(类似于 if (asyncTask1.getStatus() == AsyncTask.Status.RUNNING || asyncTask2.getStatus() == AsyncTask.Status.RUNNING ... )

    如果全部为假,那么您可以关闭progress dialog

    【讨论】:

      【解决方案3】:

      你可以这样做:

      //define progress dialog object globally in your parent class
      ProgressDialog pd = null;
      

      AsyncTask1 onPreExecute:

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

      AsyncTask2

      //do nothing
      

      AsyncTask3 onPostExecute:

      if(pd!=null)
          pd.dismiss();
      

      【讨论】:

      • 感谢您的回答,但我们不能指望最后加载的是哪个 asyntask..
      • 你不是在第一个 onPostExecute 中开始第二个任务吗?
      猜你喜欢
      • 1970-01-01
      • 2017-05-10
      • 2012-04-17
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多