【发布时间】:2016-07-06 23:58:07
【问题描述】:
在 android app onCreate 期间,我有一堆代码在一些旧设备上可能会很慢。我想在所有初始化代码运行时显示进度对话框。如果从 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 调用时它似乎不起作用?
有什么方法可以在调用显示后强制显示对话框?有什么方法可以让对话框显示并等到它可见后再继续?
感谢您的帮助。
编辑:最后我只好硬着头皮重新组织代码,以便只有缓慢的非 UI 代码在 AsyncTask 中。这让它工作了。
【问题讨论】:
-
你为什么在
doInBackground中打电话给pd.show();? -
只是尝试显示对话框。它没有帮助。
-
您的问题在于“runInit 是通常的慢启动代码。它需要在 UI 上运行”。这违背了 asynctask 的目的,即将这些东西移出 UI 线程。描述 runInit() 正在做什么,有人可以帮助您找到在 UI 线程之外执行此操作的方法。
标签: android android-asynctask progressdialog