這個問題與需要殺死ProgressDialog
的AsyncTask
有關。在任務正在運行時,活動會被破壞並重新創建(例如,電話輪換)。一個新的對話框在onSaveInstanceState()
的幫助下完成,但AsyncTask
,由以前銷燬的活動產生,看不到它。ProgressDialog,activity的onCreate()和AsyncTask
圖片,如果你願意......(例如快速的模型代碼)。
public class Bob extends Activity {
private ProgressDialog m_d;
public void onCreate(Bundle b) {
m_d = new ProgressDialog(this);
// ...
if (b != null) {
if (b.getBoolean("dialog") == true)
m_d.show();
}
// ...
}
public void onSaveInstanceState(Bundle b) {
super.onSaveInstanceState(b);
b.putBoolean("dialog", (m_d.isShowing()));
}
public void onDestroy() {
if (m_d.isShowing()) {
m_d.dismiss();
m_d = null;
}
//...
}
}
的AsyncTask
onPreExecute()
確實m_d.show()
和onPostExecute()
確實m_d.hide()
。
問題是當我的活動重新創建(例如,在電話輪換)時,AsyncTask
似乎有舊的m_d
。它是null
,因爲在onDestroy()
中遇害。
它沒有新的m_d
,當活動重新創建時創建。所以現在我有一個ProgressDialog
和那個應該在onPostExecute()
中殺死它的人看不到它。
現在呢?我需要舊的AsyncTask
以某種方式指示新的ProgressDialog
消失。
private OnItemSelectedListener onSpinnerSelection = new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// ...
new Switcharoo().execute();
}
}
private class Switcharoo extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
m_d.show();
// ...
}
protected void onPostExecute() {
if (m_d != null) m_d.hide();
// ...
}
protected Void doInBackground(Void... arg0) {
// ...
}
}
如果任務運行時,Android不殺我的活動,它的罰款。 ProgressDialog
彈出,並像我預期的那樣消失。
如果Android的決定任務運行時重新啓動我的活動以任何理由,m_d
將在onPostExecute()
null
即使我重新它onCreate()
- 它有老m_d
,而不是新的。
在這裏添加你正在執行asynctask的行。 – Sajmon 2013-03-13 22:13:03
已添加,但我不確定是否有幫助。很通用。 – JamieB 2013-03-13 22:22:57
當舊的活動被銷燬時,你能鉤住一些代碼來更新m_d嗎? – 2013-03-13 22:26:19