【问题标题】:AsyncTasks in Main activty How to show the progress dailogue主要活动中的异步任务如何显示进度对话框
【发布时间】:2013-08-21 03:47:31
【问题描述】:

当用户打开应用程序时,我的 Mainactivty Oncreate() 方法中有 3 个异步任务,我想在加载 3 个异步任务时显示进度对话框。 请指定我从哪里开始并关闭进程对话。 如果有样品请提供链接。 谢谢。

【问题讨论】:

  • 有什么代码可以提供给我们吗?
  • 到目前为止你做了什么?你可以在第一个 asyncTask 的预执行中启动它,并在最后一个 AsyncTask 的执行后关闭它。
  • 我认为在这种情况下,不确定的进度条将是最好的解决方案。
  • 您可以使用进度条并在onProgressUpdate 方法中更新进度条。干杯
  • 为什么 3 个 asynctask 不是一个?

标签: android android-asynctask progressdialog oncreate


【解决方案1】:

实际上,您已经获得了如何操作的代码。此外,我建议您在调用AsyncTask 之前创建并显示一个进度对话框。由于您有 3 个 AsyncTasks,因此如果您从服务器获取某些内容,您根本无法说出哪个将是最后一个任务。如果您有这种情况,请制作 3 个标志,如 boolean task1, task2, task3; 和每个任务的 onPostExecute 方法,将各自的标志设置为真,并检查这些所有标志是否为真,如 if(task1 && task2 && task3) progressDialog.dismiss();。因此,对于最后一个任务,它会将其标志设置为真,并且 2 个标志将已设置为真,因此当条件为真时,它将关闭进度对话框。希望你明白了。

【讨论】:

  • 谢谢你的回答我有同样的想法我正在检查其他解决方案来做到这一点..
【解决方案2】:

您可以声明进度条。然后在 onPreExecute 中,显示进度条。在 doInBackground 中,您可以计算进度值并调用 publishProgress 以显示进度值。在 onPostExecute 你可以关闭进度条。

你可以这样做:

    public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
    private ProgressDialog mProgressDialog;

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DIALOG_DOWNLOAD_PROGRESS:
            mProgressDialog = new ProgressDialog(this);
            mProgressDialog.setMessage("Downloading data file..");
            mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            mProgressDialog.setCancelable(false);
            mProgressDialog.show();
            return mProgressDialog;
        default:
            return null;
        }
    }

    private class DownloadZipFileTask extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showDialog(DIALOG_DOWNLOAD_PROGRESS);
        }

        @Override
        protected String doInBackground(String... urls) {
           Long progress;
           calculate progress
           publishProgress("" + progress);
        }

        protected void onProgressUpdate(String... progress) {
         Log.d("ANDRO_ASYNC",progress[0]);
         mProgressDialog.setProgress(Integer.parseInt(progress[0]));
    }

        @Override
        protected void onPostExecute(String result) {

            dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
        }
}

【讨论】:

  • 嗨..如果这个答案帮助你解决了你的问题,请接受这个答案,以便其他人可以知道正确的答案并且线程变得更加有用。
【解决方案3】:

您可以在第一个 AsyncTask 的 onPreExecute 方法中启动进度对话框,当为任何 AsyncTask 调用 onPostExecute 时,您可以检查其他 AsyncTask 是否已完成,如果是则关闭对话框,否则让它运行。 或者,您可以为每个 AsyncTask 启动一个单独的进度对话框,并在完成相应的 AsyncTask 时将其关闭。

【讨论】:

    【解决方案4】:

    最好在第一个异步类中启动进度条并使用相同的对象关闭最后一个异步类中的进度条....保留其余部分。

    obj.dismiss();
    

    【讨论】:

      【解决方案5】:

      这是你的 ayncTask 并使用 new Async(Your_Context).execute(); 调用它

          private class Async extends AsyncTask<String, String, Boolean>
          {
              Context context;
              ProgressDialog pd;
              Progress progress;
      
              Async (Context mcontext)
              {
                  context = mcontext; 
                  pd = new ProgressDialog(activityContext);
                  progress = new Progress(context);
              } 
      
              @Override
              protected void onPreExecute() 
              {
                  pd.setTitle("Loading..");
      
                  pd.setMessage("Please Wait..");
      
                  pd.setCancelable(false);
                  pd.show();
                  super.onPreExecute();
              }
      
              @Override
              protected Boolean doInBackground(String... params) 
              {
      
                  return flag;
              }
      
              @Override
              protected void onProgressUpdate(String... values) 
              {
                  super.onProgressUpdate(values);
      
                  pd.setMessage("Please Wait..." + values[0].toString());
              }
      
              public class Progress 
              {
                  public ServerToApp task;
      
                  public Progress(ServerToApp task) 
                  {
                      this.task = task;
                  }
      
                  public void publish(String value) 
                  {
                      task.publishProgress(value);
                  }
              }
      
              @Override
              protected void onPostExecute(Boolean result) 
              {
                  super.onPostExecute(result);
                  if(pd.isShowing()) pd.dismiss();
              }
      }
      

      为了更新进度,你应该像这样从你的方法中传递这样的值

      progress.publish(Values);
      

      希望对你有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        • 1970-01-01
        • 1970-01-01
        • 2017-01-29
        相关资源
        最近更新 更多