在show()之后,进度对话框没有完全显示?

时间:2015-02-28 15:11:43

标签: android multithreading progressdialog android-progressbar

发现了ProgressDialog的奇怪行为。

我在列表的ProgressDialog中显示onClickListener,然后在该线程中dismiss开始新线程,但在完成所有工作后:

GlobalProgressDialog.show(getActivity());
    new Thread(new Runnable() {
        @Override
        public void run() {
            //...all other logic
            GlobalProgressDialog.dismiss();
        }
    }).start();

GlobalProgressDialog我用来简化通话:

public class GlobalProgressDialog{
private static ProgressDialog progressDialog;

public static void show(Activity activity){
    progressDialog = new ProgressDialog(activity);
    progressDialog.setMessage("Loading...");
    progressDialog.show();
}

public static void dismiss(){
    if (progressDialog != null) {
        progressDialog.dismiss();
    }
}

}

对话框出现,但不是在show()被叫之后!我调试了它,发现有4个标准的Android类正在运行:

  1. AdapterView.java
  2. AbsListView.java
  3. Handler.java
  4. Looper.java
  5. 只有Looper之后ProgressDialog才会被骗。有可能欺骗这个或修复?或者也许我的代码中有一些错误?它可能是什么?

    问题是项目点击与show()之间的延迟时间为1秒。因此应用程序冻结1秒。然后只有对话框出现,所有工作都需要1-2秒,有时甚至0.5秒。在这种情况下,查看冻结应用程序并闪烁0.5秒进度对话框并不酷。

    提前致谢。

2 个答案:

答案 0 :(得分:1)

你在主线程上做了太多工作。 show()将显示对话框,但它将在主线程上执行。在解除之前它不会阻止执行。因此,在调用show()并且您没有向我们展示后,您在代码中执行的操作会导致对话框出现延迟。

再说一遍,这与您Thread启动并将其更改为AsyncTask无法解决问题无关,尽管它可能是如果模式适合您的用例,那么无论如何都要做到这一点。

答案 1 :(得分:0)

你应该在这里使用AsyncTask。

   public class DialogAsync extends AsyncTask<Void, Void, Void> {

    private Context context;
    private ProgressDialog progressDialog;

    public DialogAsync(Context context) {
        this.context = context;
        progressDialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog.setMessage("Loading...");
        progressDialog.show();

    }

    @Override
    protected Void doInBackground(Void... params) {

        // Perform your logic here
        return null;

    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        progressDialog.dismiss();
    }


}

用法:

DialogAsync globalProgessDialog = new DialogAsync(getActivity());
globalProgessDialog.execute();