activity被回收导致fragment空指针的问题

qq_27185517 2016-05-12 10:15:52
嗯,其实还是不明白 出现的原因是什么,自己测试的时候,打开fragment,之后按home键置为后台,启动多个应用,让自己的应用被系统回收了,之后重新进入自己的应用程序就报了空指针;

附上代码

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
....
if(savedInstanceState == null){
fargmentManager = getSupportFragmentManager();
}
......
}

private void replaceViewFragment(Fragment viewFr, String tag) {
LogHelper.d(TAG, "replaceViewFragment " + tag);

if (viewFr == currentViewFr) {
return;
}
FragmentTransaction mFragmentTransaction;
mFragmentTransaction = fargmentManager.beginTransaction();
mFragmentTransaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
if (currentViewFr != null) {
mFragmentTransaction.hide(currentViewFr);
}
if (viewFr.isAdded()) {
mFragmentTransaction.show(viewFr);
} else {
mFragmentTransaction.replace(R.id.ll_mainframe, viewFr, tag);
}
currentViewFr = viewFr;
mFragmentTransaction.commitAllowingStateLoss();

}


@Override
protected void onSaveInstanceState(Bundle outState) {
//super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}



如上图贴的代码:
网上的解释是说系统回收但是会帮忙存储临时数据,所以只要在onSaveInstanceState()方法中注释掉super;
但是测试的结果不行,有没有大神遇到过这个问题,请帮帮忙!急,已经找了很多方法都不行
...全文
775 14 打赏 收藏 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
恋恋西风 2016-05-13
  • 打赏
  • 举报
回复
还有一种方法,就是判断一下是不是被回收了,在Application 中设置一个变量,如果程序启动设置为真,在BaseActivity (所以Activity继承此Activity) onCreate中判断此变量是否为真,如果不为真,杀掉此进程,然后会启动一个全新自己; 就不会出现这个问题了。
qq_27185517 2016-05-13
  • 打赏
  • 举报
回复
引用 8 楼 u011248395 的回复:
楼上正解。不会给你保存自定义的fargmentManager 的
我把if(savedInstanceState == null)的判断给去掉了,现在程序在被系统回收了也不报空指针了,但是还是有一点理解的偏差,就是: 1.我在被回收之后重新打开程序,却是重新加载了一遍该activity和fragment 吗?然后点击后退按钮他返回到上一个activity的时候也是默认重新加载,这点类似应用程序被新打开的一样呢?这种做法是不是表示已经解决掉了activity被回收导致fragment报空指针的问题?还是说我还是没解决到? 2.在实际开发中,我该怎么解决activity被回收导致fragment报空指针的问题?
qq_27185517 2016-05-13
  • 打赏
  • 举报
回复
引用 10 楼 ys527663232 的回复:
楼主你先说是运行到哪一句报的空指针啊,,
fargmentManager为null
mFragmentTransaction = fargmentManager.beginTransaction();
qq_27185517 2016-05-13
  • 打赏
  • 举报
回复
引用 7 楼 xbq1991 的回复:
[quote=引用 6 楼 qq_27185517 的回复:] [quote=引用 5 楼 u011248395 的回复:] 我好奇 如果savedInstanceState 不为空的话你这个 fargmentManager是啥? 你没给这个赋值啊为null啊
我可以把自己的理解说一下吗,你看看是否是正确的: 我开了自己的应用程序,之后按home键置为后台,启动多个应用,让自己的应用被系统回收了,这个时候系统是不是会帮我们调用onSaveInstanceState方法并将临时数据存储到Bundle里面,但我们重新打开应用,程序调用onCreate()方法,onCreate()方法里面的Bundle类型的参数不是不为空了吗?这个时候这个Bundle是没有帮我们保存到fargmentManager吗?[/quote] onSaveInstanceState自己只会保存一些默认的数据,这个fragmentManager是你自己定义的变量,得在onSaveInstanceState()中自己存到Bundle outState里,然后在onCreate中再自己取出来。 不过我建议你在onCreate里直接重新get一个就好了,和之前的又没区别[/quote] 我很好奇的是;我在onSaveInstanceState方法中把super给注释掉了,系统还会帮忙保存临时数据吗?
小强哥_Kevin 2016-05-12
  • 打赏
  • 举报
回复
引用 6 楼 qq_27185517 的回复:
[quote=引用 5 楼 u011248395 的回复:] 我好奇 如果savedInstanceState 不为空的话你这个 fargmentManager是啥? 你没给这个赋值啊为null啊
我可以把自己的理解说一下吗,你看看是否是正确的: 我开了自己的应用程序,之后按home键置为后台,启动多个应用,让自己的应用被系统回收了,这个时候系统是不是会帮我们调用onSaveInstanceState方法并将临时数据存储到Bundle里面,但我们重新打开应用,程序调用onCreate()方法,onCreate()方法里面的Bundle类型的参数不是不为空了吗?这个时候这个Bundle是没有帮我们保存到fargmentManager吗?[/quote] onSaveInstanceState自己只会保存一些默认的数据,这个fragmentManager是你自己定义的变量,得在onSaveInstanceState()中自己存到Bundle outState里,然后在onCreate中再自己取出来。 不过我建议你在onCreate里直接重新get一个就好了,和之前的又没区别
qq_27185517 2016-05-12
  • 打赏
  • 举报
回复
引用 5 楼 u011248395 的回复:
我好奇 如果savedInstanceState 不为空的话你这个 fargmentManager是啥? 你没给这个赋值啊为null啊
我可以把自己的理解说一下吗,你看看是否是正确的: 我开了自己的应用程序,之后按home键置为后台,启动多个应用,让自己的应用被系统回收了,这个时候系统是不是会帮我们调用onSaveInstanceState方法并将临时数据存储到Bundle里面,但我们重新打开应用,程序调用onCreate()方法,onCreate()方法里面的Bundle类型的参数不是不为空了吗?这个时候这个Bundle是没有帮我们保存到fargmentManager吗?
淡淡的蛋蛋 2016-05-12
  • 打赏
  • 举报
回复
我好奇 如果savedInstanceState 不为空的话你这个 fargmentManager是啥? 你没给这个赋值啊为null啊
qq_27185517 2016-05-12
  • 打赏
  • 举报
回复
引用 3 楼 u011248395 的回复:
目测是fargmentManager 为null
那有没有解决的思路呢
淡淡的蛋蛋 2016-05-12
  • 打赏
  • 举报
回复
目测是fargmentManager 为null
qq_27185517 2016-05-12
  • 打赏
  • 举报
回复
还有报错信息
qq_27185517 2016-05-12
  • 打赏
  • 举报
回复
还有一段代码是显示mainFragment的:
	public void showMainFragment() {
		if (mainFragment == null) {
			mainFragment = new MainFragment();
		}
		replaceViewFragment(mainFragment, "mainFragment");
	}
ys527663232 2016-05-12
  • 打赏
  • 举报
回复
楼主你先说是运行到哪一句报的空指针啊,,
serf 2016-05-12
  • 打赏
  • 举报
回复
ANDROD 4 高级编程中找答案
淡淡的蛋蛋 2016-05-12
  • 打赏
  • 举报
回复
楼上正解。不会给你保存自定义的fargmentManager 的

80,490

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧