【问题标题】:Progress dialog does not show exactly after show()?进度对话框在 show() 之后不完全显示?
【发布时间】:2015-05-01 05:38:17
【问题描述】:

发现ProgressDialog 的奇怪行为。

在启动新线程之前,我在列表的onClickListener 中显示ProgressDialog,在该线程内显示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. Lo​​oper.java

只有在Looper 之后,ProgressDialog 才会下雪。是否有可能欺骗或修复?或者也许我的代码有问题?会是什么?

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

提前致谢。

【问题讨论】:

  • 简单的解决方案是使用AsyncTask 而不是Thread
  • 我已经尝试过 AsyncTask。它的工作原理相同。 preExecute()和点击之间还有一段距离

标签: android multithreading progressdialog android-progressbar


【解决方案1】:

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

再次澄清一下,这与您正在启动的 Thread 无关,将其更改为 AsyncTask 不会修复它,尽管如果模式适合您的用例。

【讨论】:

    【解决方案2】:

    您应该在这里使用 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();
    

    【讨论】:

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