您的位置:首页 > 移动开发 > Android开发

Android点击Home键后fragment重新加载问题

2016-06-30 15:07 951 查看
应用在点击Home键时,会调用onSaveInstanceState方法,随后是OnStop方法,如果需要缓存数值,就保存在onSaveInstanceState方法中,如果是长期保存的数值,就需要保存在OnStop方法中。当需要获取数值的时候,可以在OnResume方法中获取,或者在onCreate中获取。有人会问,这两者有什么区别呢?首先,在应用关闭后再次打开时(短时间内),oncreate是不会被调用的,做开发的都知道,oncreate只在第一次加载的时候调用,所以一般在点击Home键切换到后台时,调用顺序是onSaveInstanceState、onPause、onStop,再次打开时:onRestart、onStart、onResume之后Activity继续运行,但是当Home被点击后(长期时间),这时候再次打开时:oncreate、onRestart、onStart、onResume;这就是两者的区别

我们在说会我们的问题,在点击Home键之后长时间不打开应用,或者应用被其他多个应用推到底栈,Activity所占用的内存就会被回收,当再次打开加载,就会加载Oncreate方法,系统会将保存在onSaveInstanceState方法中的fragment对象释放,这时候再次去加载fragment对象,就会导致重复加载而崩溃;说完了问题,我们来聊聊解决办法:

解决办法:

方法1:在fragmentActivity里oncreate方法判断savedInstanceState==null才生成新Fragment,否则不做处理。

(此方法验证失败,由于onSaveInstanceState保存的fragment对象,所以在不为空时,当前的Activity会显示首个fragment,界面上控件没有实例化,所以全部点击失效,导致程序崩溃)

方法2:在fragmentActivity里重写onSaveInstanceState方法,但不做实现,也就是将super.onSaveInstanceState(outState)注释掉。

(方法验证失败,注释掉super.onSaveInstanceState(outState)代码,即在onSaveInstanceState方法中对fragment对象不做保存,重新加载Activity就不会导致fragment重新加载,但是依然会报错,原因不明,估计是fragment的对象无效)

@Override
protected void onSaveInstanceState(Bundle outState) {

// super.onSaveInstanceState(outState);
}

推荐:第三种,我们接着方法二来延续,取消onSaveInstanceState中的fragment对象管理的保存,并且在重新加载Oncreate方法时做出判断,如果为空,说明是刚刚打开应用,正常加载fragment,如果不为空,说明Activity曾经被回收,这时候的fragment需要重新加载,具体代码如下:

if (savedInstanceState != null) {
manager = getSupportFragmentManager();//重新创建Manager,防止此对象为空
manager.popBackStackImmediate(null, 1);//弹出所有fragment
}

再加上方法二中的代码

@Override
protected void onSaveInstanceState(Bundle outState) {

// super.onSaveInstanceState(outState);
}

manager不重复冲突,至此问题终于解决,也就是在用户Home点击切换到后台,长期不使用的情况下,再次打开重新加载应用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: