私はアプリを作成しており、次のシナリオがあります。最初に Acitivty を表示し、サーバーからデータをロードしているときに ProgressDialog を表示します。ダイアログが正しく表示されるように、これが解決策であることがわかったので、スレッドで読み込みタスクを実行します
showDialog(DIALOG_LOAD);
loadListThread = new Thread(new Runnable(){
@Override
public void run(){
service.execRequest();
loadingFinishedHandler.sendEmptyMessage(0);
MyActivity.this.dismissDialog(MyActivity.DIALOG_LOAD);
}
});
loadListThread.start();
スレッドが終了したら、ハンドラーに通知します。繰り返しますが、これは、スレッドにいなくてもアクティビティのビューにアクセスするという問題に対して私が見つけた解決策です
loadingFinishedHandler = new Handler(){
@Override
public void handleMessage(Message msg){
showList();
}
};
ロードが終わったら、データを正しく受信したかどうかを確認します。そうでない場合は、エラーダイアログを表示したい:
showDialog(DIALOG_ERROR);
onCreateDialog メソッドでダイアログを呼び出します
public Dialog onCreateDialog(int dialogId){
switch(dialogId){
case DIALOG_LOAD:
String message = getString(R.string.load);
ProgressDialog loadDialog = new ProgressDialog(this);
loadDialog.setMessage(message);
loadDialog.setCancelable(false);
return loadDialog;
case DIALOG_ERROR:
String message = getString(R.string.error);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(errorMessage);
builder.setNeutralButton(getString(R.string.ok), null);
return builder.create();
}
return null;
}
ここに問題があります。データの読み込み中に電話の向きを変更し、後でエラー ダイアログが作成されると、次のメッセージが表示されます。
Activity [...] has leaked window [...] that was originally added here
なぜこれが起こっているのか理解しています。電話を回転させたときにビューが再作成され、showDialog() が明らかに古いものにアクセスしようとしています。しかし、私はそれを修正する方法がわかりません。
誰にもアイデアがありますか?
編集:解決しました:-)方向の変更時にアクティビティが再起動するのを防ぐことができることがわかりました。この記事でそれについて読みました ランタイムの変更の処理
追加して AndroidManifest で宣言しました
android:configChanges="orientation"
私は自分で向きの変更を処理します。これらの変更は、このメソッドで処理できるようになりました
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
}
しかし、私の場合、コードを追加する必要はありませんでした!