关于Email 低概率出现异常
06-07 02:45:20.344 E/AndroidRuntime( 2882): FATAL EXCEPTION: main
06-07 02:45:20.344 E/AndroidRuntime( 2882): java.lang.IllegalStateException: Failure saving state: ErrorDialog{41461640 #1 ErrorDialog} has target not in fragment manager: AccountCheckSettingsFragment{41461088}
06-07 02:45:20.344 E/AndroidRuntime( 2882): at android.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1609)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at android.app.Activity.onSaveInstanceState(Activity.java:1202)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at com.android.email.activity.setup.AccountSetupActivity.onSaveInstanceState(AccountSetupActivity.java:41)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at android.app.Activity.performSaveInstanceState(Activity.java:1150)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1215)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3007)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3066)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at android.app.ActivityThread.access$900(ActivityThread.java:134)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1230)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at android.os.Handler.dispatchMessage(Handler.java:99)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at android.os.Looper.loop(Looper.java:137)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at android.app.ActivityThread.main(ActivityThread.java:4830)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at java.lang.reflect.Method.invokeNative(Native Method)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at java.lang.reflect.Method.invoke(Method.java:511)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
06-07 02:45:20.344 E/AndroidRuntime( 2882): at dalvik.system.NativeStart.main(Native Method)
06-07 02:45:20.354 W/ActivityManager( 310): Force finishing activity com.android.email/.activity.setup.AccountSetupOptions
public class AccountSetupActivity extends Activity {
private static final boolean DEBUG_SETUP_FLOWS = false; // Don't check in set to true
@Override
public void onCreate(Bundle savedInstanceState) {
SetupData.restore(savedInstanceState);
super.onCreate(savedInstanceState);
if (DEBUG_SETUP_FLOWS) {
Log.d(getClass().getName(), SetupData.debugString());
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState); SetupData.save(outState);
}
}
3).而在系统响应“下一步”按键启动异步任务后台处理过程中(大致100ms左右,此时CheckingDialog已安装显示),极限操作快速点击“上一步”系统响应该事件,即执行当前activity的“back”键处理,这将对activity属下的FragmentManager的后退栈做一次pop处理(移除之前压入该栈中的AccountCheckSettingsFragment事务),即卸载销毁AccountCheckSettingsFragment;与此同时,AccountCheckSettingsFragment销毁意味着账户检查结束,这将取消账户检查异常任务
4).此时即造成了异常场景:AccountCheckSettingsFragment被销毁,账户检查异常任务被取消进而导致靠异步任务post结果进行销毁CheckingDialog的流程无法执行;此时按下“home”键后将触发activity的onSaveInstanceState保存其上各种信息如fragments各种参数,进而与该activity对应的FragmentManager检查fragment数据异常:CheckingDialog存活,但是CheckingDialog的target fragment即 AccountCheckSettingsFragment已消失,抛出异常IllegalStateException
tempFm 偶尔为null上述场景为其一,此处POP/IMAP/Exchange类似,ErrorDialog和CheckingDialog类似,保护的话可在AccountCheckSettingsFragment的onDestroy中增加dialog的dismiss、创建dialog的地方增加tempFm的判断