发现了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类正在运行:
只有Looper
之后ProgressDialog
才会被骗。有可能欺骗这个或修复?或者也许我的代码中有一些错误?它可能是什么?
问题是项目点击与show()
之间的延迟时间为1秒。因此应用程序冻结1秒。然后只有对话框出现,所有工作都需要1-2秒,有时甚至0.5秒。在这种情况下,查看冻结应用程序并闪烁0.5秒进度对话框并不酷。
提前致谢。
答案 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();