作者:彭元蓮_198 | 来源:互联网 | 2023-09-25 19:11
问题描述当在其他页面出现异常后app触发闪退,在返回到有使用FragmentTransaction添加Fragment的页面,会出现Fragment重叠,数据不一致的问题 问题原因
问题描述
当在其他页面出现异常后app触发闪退,在返回到有使用FragmentTransaction添加Fragment的页面,会出现Fragment重叠,数据不一致的问题
问题原因
App闪退后,要返回的上一级Activity会被重新创建(有点类似横竖屏后的Activity), Activity在savedInstanceState会将保存的Fragment重新添加. 而你又在重新触发的生命周期里再次创建Fragment并且添加到FragmentTransaction.这个时候就会出现重复的Fragment.
也可以用抓内存泄露的方式看到重复的Fragment有2个内存地址
解决办法
方法1:在fragmentActivity里oncreate方法判断savedInstanceState==null才生成新Fragment,否则不做处理。
方法2:在fragmentActivity里重写onSaveInstanceState方法,但不做实现,也就是将super.onSaveInstanceState(outState)注释掉。
上面2个方式是百度上大量提供的方法,还有一种办法是在替代回去
@Override
public void onAttachFragment(@NonNull Fragment fragment) {
super.onAttachFragment(fragment);
if (mHomeFragment == null && fragment instanceof HomeFragment) {
mHomeFragment = (HomeFragment) fragment;
return;
}
if (mMineFragment == null && fragment instanceof MineFragment) {
mMineFragment = (MineFragment) fragment;
return;
}
//因为MessageFragment是Message模块路由的Fragment,所以这里用类名判断
if (mMessageFragment == null && TextUtils.equals(fragment.getClass().getSimpleName(), "MessageFragment")) {
mMessageFragment = (Fragment) fragment;
}
}