【问题标题】:ProgressDialog in AsyncTask only displayed at the end of the task for a short timeAsyncTask 中的 ProgressDialog 只在任务结束时短暂显示
【发布时间】:2013-12-08 14:42:59
【问题描述】:

我有一个名为LoginTaskAsyncTask<Client, Void, Boolean> 和一个ProgressDialog,您可以在此处查看。 现在我的问题是,如果我使用LoginTask(...).execute().get() 启动此任务,ProgressDialog 只会在AsyncTask 的末尾显示很短。我还输入了一些Thread.sleep(),但如果我这样做,我还会在线程末尾得到一个ProgressDialog

ProgressDialog 如何显示整个异步任务?

    public class LoginTask extends AsyncTask<Client, Void, Boolean>
    {
      private ProgressDialog progressDialog;
      private MainActivity activity;

      public LoginTask(MainActivity activity)
      {
    this.activity = activity;
  }

  @Override
  protected void onPreExecute()
  {
    progressDialog = new ProgressDialog(activity);
    progressDialog.setIndeterminate(true);
    progressDialog.setMessage(activity.getText(R.string.asynctask_login_connect));
    progressDialog.setCancelable(false);
    progressDialog.show();
  }

  @Override
  protected Boolean doInBackground(Client... params)
  {
    try
    {
      Client client = params[0];
      if (client.connect())
      {
        progressDialog.setMessage(activity.getText(R.string.asynctask_login));
        if (client.manageHandshake())
        {
          return true;
        }
        else
          return false;
      }
      else
        return false;
    }
    catch (Exception e)
    {
      Log.e(LoginTask.class.getSimpleName(), "Can not handshake and connect to/with server.", e);
      return false;
    }
  }

  @Override
  protected void onPostExecute(Boolean result)
  {
    progressDialog.dismiss();
  }

}

【问题讨论】:

  • 为什么要调用get方法?使用 onPostExecute 从 doInBackground 获取结果将显示 progressDialog 直到 doInBackground 未完成
  • @ρяσѕρєяK 我不太明白。我在 onPostExecute 中得到了结果,但那该怎么办呢?可以举个例子吗?
  • 启动 AsyncTask LoginTask(...).execute() 而不是 LoginTask(...).execute().get() 并在 onPostExecute 中从服务器获取结果后移动要执行的代码

标签: java android android-asynctask progressdialog


【解决方案1】:

来自 get() 的文档,

如有必要,等待计算完成,然后检索 结果。

这意味着它将阻塞调用Thread,直到执行完成;这违背了使用AsyncTask 的全部目的。只需调用 execute() 并从 onPostExecute() 更新 UI Thread

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 2012-08-13
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多