在Android應用程序onCreate期間,我有一堆代碼可能在一些較舊的設備上很慢。我想在運行所有init代碼的同時顯示進度對話框。如果由onCreate調用,則Dialog將不會顯示,因爲進一步的代碼會阻止UI。所以它需要進入一個AsyncTask。顯示progressdialog不顯示在asyctask
這是我的任務。
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是通常的慢啓動代碼。它需要在用戶界面上運行。
如果我刪除了pd.dismiss調用,進程對話框會在初始代碼完成後出現,所以它正在創建好,只是不顯示。
根據其他帖子,上述代碼是正確的方式來做到這一點,但是當從onCreate調用它似乎並沒有工作?
任何方法來強制顯示對話後顯示一個對話框?任何方式我可以讓對話框顯示並等待,直到它可見之後再繼續?
感謝您的任何幫助。
編輯:最後,我只好咬住子彈並重新組織代碼,以便只有慢的非UI代碼是在AsyncTask內。這讓它工作。
你爲什麼要叫'pd.show();''在doInBackground'? – Sharj
只是試圖讓對話框顯示。它沒有幫助。 – Some1Else
你的問題是在語句「runInit是通常的慢啓動代碼,它需要在用戶界面上運行」。這就違背了將這些東西移出UI線程的asynctask的目的。描述runInit()在做什麼,並且有人可以幫助您找到在UI線程之外執行的方法。 – alzee