进度对话框显示为时已晚(Progress dialog shows too late)

2019-09-17 18:39发布

我有我想要做以下的应用程序:

  1. 显示一个按钮和TextView的活动。
  2. 用户点击按钮,程序显示一个进度对话框。
  3. 应用程序调用Web服务得到一个列表。
  4. 进度对话框是隐藏的,会出现一个列表选择对话框中显示的检索列表。
  5. 用户选择列表中的项目之一。
  6. 项目显示在TextView的。

问题是,这种情况发生:

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

web服务是与进度对话框在onPreExecute()方法中所示的的AsyncTask执行并驳回在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();

我需要的东西添加到代码列表选择对话框之前,为了确保进度对话框显示?

先感谢您。

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

该的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以及设置它的消息之前,我甚至宣称/执行任务。 然后,任务说明和驳回 (不隐藏)对话框。

让我知道这个是否奏效!



Answer 2:

我有同样的确切问题。 我试图表明任务前的进度对话框,用后可运行,使用runOnUiTask运行的。 没有什么是做这件事。
对话框出现了总是干完活后,还是没有显示在所有。

该解决方案我刚刚发现,和它的作品对我来说,事实证明,就是把doInBackground代码放到一个try {}赶上{}块。

不要问我为什么它的工作原理。 我的结论是,什么是错的Android操作系统的设计,阻止在某些情况下调度消息messahe处理程序。 不知怎么的try / catch给处理器制动和消息发送。

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

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


文章来源: Progress dialog shows too late