进度对话框显示为时已晚

时间:2012-06-05 15:52:32

标签: android android-asynctask progressdialog

我有一个应用程序,我想要执行以下操作:

  1. 使用按钮和TextView显示活动。
  2. 用户点击按钮和应用程序会显示进度对话框。
  3. 应用程序调用Web服务获取列表。
  4. 隐藏“进度”对话框,并出现“列表选择”对话框以显示检索到的列表。
  5. 用户选择列表中的一个项目。
  6. 项目显示在TextView中。
  7. 问题是这种情况发生了:

    1. 使用按钮和TextView显示活动。
    2. 用户点击按钮,按钮状态更改为已选中。
    3. 几秒钟后,将出现“列表选择”对话框以显示检索到的列表。
    4. 用户选择列表中的一个项目。
    5. 进度对话框显示几秒钟,然后隐藏。
    6. 项目显示在TextView中。
    7. 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();
        }
      }
      

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

      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();
      

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

      提前谢谢。

2 个答案:

答案 0 :(得分:0)

我是这样做的:

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();
    }
};

asynctask:

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,并在我甚至声明/执行任务之前设置了它的消息。然后,任务显示并解散(不隐藏)对话框。

让我知道这是否有效!

答案 1 :(得分:0)

我遇到了同样的问题。我试图在任务之前使用runOnUiTask runnable使用post runnable显示Progress对话框。什么都没做 工作完成后,对话框始终显示,或根本没有显示。

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

不要问我为什么会这样。我的结论是Android Os设计中的某些内容是错误的,它阻止了Messahe处理程序在某些情况下调度消息。并且不知何故try / catch为处理程序提供制动并且消息被分派。

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

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