FragmentTransaction.commitAllowingStateLossで、バックグラウンドに置いておく前にFragmentの状態を保存しておいて、その間に非同期処理などを経てFragment状態変更をしてしまうと例外が発生がしてしまうことがあった。
DialogFragmentにおいても、バックグラウンドに置いておいた状態で、非同期処理後にダイアログ閉じようとすると、例外が起きる。
DialogFragment.dismissAllowingStateLossで、それを抑止できる。
DialogFragment | Android Developers
CustomAsyncTask.javaで、
package com.bgstation0.android.sample.dialogfragment_;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
public class CustomAsyncTask extends AsyncTask<Integer, Integer, String> {
Context context;
CustomDialogFragment cdf;
public CustomAsyncTask(Context context){
this.context = context;
}
public CustomAsyncTask(Context context, CustomDialogFragment cdf){
this(context);
this.cdf = cdf;
}
@Override
protected String doInBackground(Integer... params){
String ret = "";
try{
Thread.sleep(10000);
if (params.length > 0){
ret = "params[0] = " + params[0];
}
else{
ret = "params[0] = nothing";
}
}
catch (Exception ex){
ret = "excaption";
}
return ret;
}
@Override
protected void onPostExecute(String result){
try{
cdf.dismiss();
Toast.makeText(context, "cdf.dismiss() success!", Toast.LENGTH_LONG).show();
}
catch (Exception ex){
Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show();
}
}
}
まず、そのままdismissでやると、
起動時。
Button1押して、
ダイアログ表示。
ここのButton1押して、
10秒後にダイアログ閉じて非表示成功。
これはいいんだけど、次の場合について考える。
ダイアログ表示中にButton1押す。
そして、10秒経たないうちに素早くホームボタンを押す。
10秒経つと例外が出てしまう。
横にしてDialogFragmentを起動する。
閉じられていない状態になっちゃってる。
ちなみに回転しないで復帰すると閉じられている。
cdf.dismissAllowingStateLossにすると、
例外は起きない。
ただ、回転して復帰だとダイアログ表示状態、回転しないと非表示で、ここは変わってなかった。
まあ、tryを囲まずに例外が起きないってことかな。
Sample/android/DialogFragment/dismissAllowingStateLoss/src/DialogFragment at master · bg1bgst333/Sample · GitHub