关于fragment操作报错Activity has been destroyed的问题

Android 码拜 4年前 (2016-03-27) 757次浏览
原因是程序需要使用服务中的对象,所以本人的通过startService和bind混合启动。
问题来了,本人从任务列表中退出任务(也就是后台中清除任务),再次启动,fragment的commitAllowingStateLoss就会报错

11-03 17:38:48.993: E/AndroidRuntime(4231): FATAL EXCEPTION: main
11-03 17:38:48.993: E/AndroidRuntime(4231): java.lang.IllegalStateException: Activity has been destroyed
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1365)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at com.didi.activity.MainActivity.setMainUi(MainActivity.java:468)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at com.didi.activity.MainActivity.onLoninSuccess(MainActivity.java:1138)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at com.didi.activity.LoginManager$LoginTask.onPostExecute(LoginManager.java:156)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at com.didi.activity.LoginManager$LoginTask.onPostExecute(LoginManager.java:1)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at android.os.AsyncTask.finish(AsyncTask.java:631)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at android.os.AsyncTask.access$600(AsyncTask.java:177)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at android.os.Handler.dispatchMessage(Handler.java:99)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at android.os.Looper.loop(Looper.java:153)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at android.app.ActivityThread.main(ActivityThread.java:5297)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at java.lang.reflect.Method.invokeNative(Native Method)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at java.lang.reflect.Method.invoke(Method.java:511)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at dalvik.system.NativeStart.main(Native Method)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at Android.MODEL(Witsgo)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at Android.VERSION(4.2.1)
11-03 17:38:48.993: E/AndroidRuntime(4231): 	at Android.FINGERPRINT(alps/V6/V6:4.2.1/JOP40D/1374120644:user/test-keys)

当本人把后台服务彻底清楚的时候,重复操作就不会报错,但本人具体不知道错误的问题在那里、

解决方案

40

原因:原因是你用了Bound Service 和 Start Service两种方法启动了Service。
假如只是Bound Service是没有问题的,原因是绑定它的Activity销毁时,Service也就销毁了。
但是,当你用Start Service时,启动它的Activity销毁时,Service是不会跟着一起销毁的,而是一直在后台运行着。
所以现在的问题就是,你在Start Service中用到了已经被destroy的Activity中的东西,所以。
ps:以上是个人理解而已。建议加强Activity中Service的管理,如当Activity销毁时,也要显示调用stopService()终止Service。
或是Service本身调用stopSelf()终止自身。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于fragment操作报错Activity has been destroyed的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)