この質問は、AsyncTask
を殺す必要がある に関係しています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()
です。
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