【问题标题】:Progress dialog shows too late进度对话框显示太晚
【发布时间】:2012-06-05 15:52:32
【问题描述】:

我有一个想要执行以下操作的应用:

  1. 使用按钮和 TextView 显示活动。
  2. 用户点击按钮,应用显示进度对话框。
  3. 应用调用网络服务来获取列表。
  4. 进度对话框被隐藏,并出现一个列表选择对话框以显示检索到的列表。
  5. 用户选择列表中的一项。
  6. 项目显示在 TextView 中。

问题是这种情况发生了:

  1. 使用按钮和 TextView 显示活动。
  2. 用户点击按钮,按钮状态变为选中状态。
  3. 几秒钟后,列表选择对话框出现,显示检索到的列表。
  4. 用户选择列表中的一项。
  5. 进度对话框显示几秒钟,然后隐藏。
  6. 项目显示在 TextView 中。

Web 服务在 AsyncTask 中执行,进度对话框显示在 onPreExecute() 方法中,并在 onPostExecute() 方法中关闭:

public class WebService extends AsyncTask<Void, Void, Boolean> {

  public void onPreExecute() {
    _progressDialog = ProgressDialog.show(_context, "", message);
  }

  protected Boolean doInBackground(Void... params) {
    try {
      // Execute web service
    }
    catch (Exception e) {
      e.printStackTrace();
    }

    return true;
  }

  protected void onPostExecute(Boolean result) {
    _progressDialog.hide();
  }
}

执行网络服务和显示对话框的代码:

WebService ws= new WebService();
ws.execute();

// Web service saves retrieved list in local db

// Retrieve list from local db

AlertDialog.Builder db = new AlertDialog.Builder(context);
db.setTitle("Select an Item");
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(context,
        android.R.layout.simple_selectable_list_item, list);
db.setAdapter(listAdapter, null);
db.show();

我是否需要在代码中添加一些内容以确保进度对话框显示在列表选择对话框之前?

提前谢谢你。

【问题讨论】:

    标签: android android-asynctask progressdialog


    【解决方案1】:

    我是这样做的:

    public OnClickListener loginListener = new OnClickListener() {
        public void onClick(View v) {
            ProgressDialog progressDialog = new ProgressDialog(activity);
            progressDialog.setMessage("Logging in...");
            LoginTask loginTask = new LoginTask(activity, progressDialog, loginLayout, loggedInLayout);
            loginTask.execute();
        }
    };
    

    异步任务:

    protected void onPreExecute() {
        progressDialog.show();
    }
    
    protected void onPostExecute(Integer responseCode) {
    if (responseCode == 1) {
            progressDialog.dismiss();
            int duration = Toast.LENGTH_SHORT;
            Toast toast = Toast.makeText(activity.getApplicationContext(), "Logged in.", duration);
            toast.show();
            activity.bar.getTabAt(0).setText(dbHandler.getUserDetails().get("email"));
    

    所以,我实际上在主活动中创建了 ProgressDialog,并在我声明/执行任务之前设置了它的消息。然后,任务显示并关闭(而不是隐藏)对话框。

    让我知道这是否有效!

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。我试图在任务之前显示进度对话框,使用 post runnable,使用 runOnUiTask 可运行。没有什么能做到这一点。
      对话框总是在工作完成后出现,或者根本不出现。

      我刚刚找到并且证明对我有用的解决方案是将 doInBackground 代码放入 try{}catch{} 块中。

      不要问我为什么会这样。我的结论是,在某些情况下,Android Os 设计中出现了问题,阻止了messahe 处理程序发送消息。并且以某种方式 try/catch 给处理程序一个刹车,消息被发送。

      注意:即使我的代码没有抛出任何异常,我也使用了 try/catch 块,只是使用了

      try {
           // code
      }
      catch( Exception e) { }
      

      【讨论】:

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