这个问题与AsyncTask
需要杀死 a 的 a 有关ProgressDialog
。在任务运行时,活动被销毁并重新创建(例如手机轮换)。在 的帮助下创建了一个新对话框,onSaveInstanceState()
但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()
。
它没有 new 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
也会null
在其中- 它有旧的,而不是新的。onPostExecute()
onCreate()
m_d