New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于Activity被回收,Fragment还在的问题 #256
Comments
建议用 ViewPage来管理Fragment. hide和show就不用手动去控制了. 但是奔溃前那些被hide的Fragment,全部处于可见状态,切无法操控 原因是应为 fragment被回收,然后 变透明了 |
加个背景色好像就行了以前也遇到类似问题加个背景色就解决了 |
@tanranran 这么说view没被回收么?不然怎么会出现呢? |
@caowen 可以试试。但是这样子没有治根啊。 |
重写主Activity的onSaveInstance()方法,这个方法做空实现,就是不做处理,这样就不会去保存Fragment的状态,当主Activity重启的时候,也就不会去恢复之前遗留的Fragment |
@tanxiaoluo 想要快速治根的话就用ViewPage |
@szitguy 试过这个,还是老样子啊。感觉之前被hide的Fragment的叠加成了奔溃后生成Activity的背景了。 |
@szitguy 刚刚手滑了。。复写错方法了。这样子是可以的。 |
@tanranran 值得一试。 |
@tanxiaoluo 呵呵,我就说我产品上个版本解决的,应该是可以的。 |
定义全局的异常处理,app崩溃以后直接杀进程再重启比较好 |
在Activity onCreate的时候获取它包含的Fragment的总数,如果size大与0,你可以for循环干掉它,或者直接赋给对应的Fragment变量(通过tag 获取Fragment, add Fragment的时候需要设置tag) |
@tanxiaoluo 这种情况下,fragment会自动重建,建议每一个fragment都加tag,先通过fragment manager检测是否已经重建,没有的话再新建,这样才能控制住系统给你自动重建的fragment。 |
我是这么弄的
|
个人觉得:fragment 应该已经被回收了。之所以fragment的view之所以还存在,是因为fragment[view]成为activity[view]的child了。系统对于有id的 view 会尝试恢复的状态。,之所以之前hide[view]显示出来,因为那些view的可见性是对于fragment而言的,对于activity而言全都是具有可见性的,所以解决办法1:是复写onsaveInstance()。2:杀掉进程。 |
@szitguy @Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
}
@Override
protected void onSaveInstanceState(Bundle outState) {
} @tanranran |
@szitguy @Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
}
@Override
protected void onSaveInstanceState(Bundle outState) {
} @tanranran |
@AlanCheen 重写Activity的: vp+fragment确实也会出现。 另外,个人感觉这个方式并不是最好,但是见效是最快的,所以在没有其他问题的情况下先这么用着吧 |
activity重写onCreate(bundle saveInstance)方法,在里面做个判断if(saveInstance=null){ |
@szitguy 谢谢你的回复. |
@AlanCheen View保存不了啥意思?是View的状态保存不了吧? 这么做确实有这个问题,请教一下你用什么其他方法解决的?可否分享下?谢谢 |
@szitguy |
谢谢分享 |
我之前项目中也出现这个问题,app切换到后台然后打开其他app玩,一段时间过后再回来,界面还是一样的,但是activity已经被回收又重新创建了,而之前的fragment并没有被回收,此时该fragment中调用getActivity()返回的是null,结果空指针。 |
viewPager可以直接setAdapter(null)来清除掉fragment ,至于保存view的状态。。我感觉保存Fragment的view的状态很危险,我现在的方法就是不保存,每次oncreateView都更新状态,需要做好相关变量的清理 |
我是用这个http://wml.farbox.com/post/fragment-overlay-problem 链接里的方法1解决的问题,我不建议重写onSaveInstanceState的方式,既然之前你都创建好了fragment了,为什么只是因为系统回收的问题就强行再去创建新的fragment呢,直接通过链接里的方法1去取你已经之前创建好的fragment岂不是更好?不然SDK的开发者为什么会多此一举的去保存fragment呢 |
因为内存吃紧,或者Exception, Activity被销毁,然后Activity被重建这个过程中,Activity中的Fragment是没有被回收的,而是在Activity的onSaveInstanceState()被保存到了Bundle中。在Activity恢复的时候,Fragment也会被恢复,但是这时候Fragment会堆叠在一起。 现在BottomNavigationBar成为android标配后,Fragment的使用基本成为一种模式。针对这个现象专门写了一个库,FragmentNavigator,来更高效方便的管理Fragment。自动处理fragment的状态保存和状态恢复。代码很简单,不赘述。 在demo中,我提供了crash app的按钮,来演示Fragment在app crash以及restart这个过程中restore状态的过程。支持Fragment in activity和Fragment 相互的嵌套使用。 |
这个问题竟然还有人在看。。,之前add Fragment的时候增加TAG进去,后面可以用if(saveInstance != null) xxx.findFragmentbyTag来找到之前的Fragment |
为什么我的试了两个方法都没用 = =! |
@flyingup 我都是在oncreate方法里判断的,如果有fragment就全部remove掉,当然你拿到的是一个list,在remove的时候一定要判断是否是null。 |
原因 使用 Fragment 的状态保存,当系统内存不足,Fragment 的宿主 Activity 回收的时候,Fragment 的实例并没有随之被回收。Activity 被系统回收时,会主动调用 onSaveInstance() 方法来保存视图层(View Hierarchy),所以当 Activity 通过导航再次被重建时,之前被实例化过的 Fragment 依然会出现在 Activity 中,此时的 FragmentTransaction 中的相当于又再次 add 了 fragment 进去的,hide()和show()方法对之前保存的fragment已经失效了。综上这些因素导致了多个Fragment重叠在一起。 解决 方案一: 方案二: |
@tanranran 我使用的就是viewpager,但是会在activity的onCreate方法中调用super.onCreate(savedInstanceState)时,抛出 这个问题确实可以通过屏蔽 super.onSaveInstanceState(outState)来解决。 你有遇到这个问题吗? |
最近做一个项目,主页动态绑定了四个Fragment,Fragment切换时用的是hide,主Activity的启动模式是singleTask。现在遇到一个这样子的问题,当某个Activity奔溃的时候, 主activity也跟着重新走了一次生命周期的流程,但是奔溃前那些被hide的Fragment,全部处于可见状态,切无法操控。。
The text was updated successfully, but these errors were encountered: