在Android应用程序onCreate期间,我有一堆代码,在某些旧设备上可能会很慢。我想在所有init代码运行时显示progressdialog。如果从onCreate调用,则不会显示对话框,因为进一步的代码会阻止UI。所以它需要进入AsyncTask。
这是我的任务。
class startupTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
pd = new ProgressDialog(mainContext);
pd.setMessage("Starting up. Please wait...");
pd.setIndeterminate(true);
pd.setCancelable(false);
pd.show();
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
pd.show();
runInit();
}
});
return null;
}
@Override
protected void onPostExecute(Void result) {
if (pd != null) {
pd.dismiss();
}
super.onPostExecute(result);
}
}
但对话框仍未显示? runInit是通常的慢启动代码。它需要在UI上运行。
如果我删除了pd.dismiss调用,那么一旦初始化代码完成就会出现进度对话框,所以它被创建好了,只是没有显示。
根据其他帖子,上面的代码是正确的方法,但是从onCreate调用它似乎不起作用?
在调用show之后强制显示对话框的任何方法?我可以用任何方式让对话框显示并等到可见之后再继续吗?
感谢您的帮助。
编辑:最后我只需要咬紧牙关并重新组织代码,以便只有缓慢的非UI代码才能进入AsyncTask。这让它发挥作用。
答案 0 :(得分:0)
你的runInit在做什么?你在UI线程上运行,它被阻止了同样的方式。
答案 1 :(得分:0)
onPreExecute(),onPostExecute()和onProgressUpdate()可以访问UI线程,但是doInBackground()没有。
如果runInit()在UI上执行某些操作,则会阻止它,并且可能会生成您忽略的异常。
您应该对doInBackground执行操作,并使用publishProgress()将要更新的onProgressUpdate()数据发送到您的UI / ProgressBar状态。
这是一个例子:
new AsyncTask<Void,Object,Void>()
{
@Override
protected Void doInBackground(Void... params)
{
Object[] _progress = new Object[]{"Decompressing", 1};
publishProgress(_progress);
}
@Override
protected void onPostExecute(Void params)
{
}
@Override
protected void onPreExecute()
{
}
@Override
protected void onProgressUpdate(Object... values)
{
txtProgress.setText(values[0].toString());
progressBar.setProgress(Integer.parseInt(values[1].toString()));
}
}.execute();