当应用Crash后fragment出现白屏

2016-10-11  本文已影响1313人  Ggx的代码之旅

前段时间,发现一个问题,就是当应用发生Crash后,fragment莫名其妙的出现了白屏,经检查发现,其实并不是fragment没有加载而是空指针导致了数据无法加载所以产生了白屏现象。这是一个什么空指针呢?错误信息显示,在fragment中使用了getContext()方法 返回了null。这就奇怪了。应用崩溃,activity重启,上下文对象应该已经产生了呀!为什么还是会获取到null。我们知道fragment是依附于Activity的,可以说Activity在它就在,Activity不再他就销毁。现在既然activity已经重新恢复了为什么,还是会拿不到Context对象?

其实一切都是这个方法造成的。

@Override
protected void onSaveInstanceState(Bundle outState) {
     //注释即可解决问题
    //super.onSaveInstanceState(outState);
}

当发生异常之后,系统会尝试的去重新恢复界面,就会执行这个方法,这个方法里面系统缓存了,之前界面的一些数据,包括fragment,可以得知Activity中的fragment也被系统给缓存起来了,发生崩溃以后fragment并没有随着Activity而销毁掉。因此这个时候fragment是不属于新的Activity的,还是旧的,所以才会拿不到Context对象。我们需要做的就是不让系统缓存,所以只需要把上面代码中的方法给注释掉就好了。这样fragment就会跟着Activity一起销毁掉了。

由上面的崩溃产生了一个思考。
当Activity被系统给回收了会不会也导致fragment的getActivity或getContext为null?
答案显而易见。可以肯定是一定的。曾经一直出现的莫名其妙的白屏,我都误认为是崩溃了,一直都无法彻底根除,知道现在明白的原由,才发现原来一直都走错了。

上一篇下一篇

猜你喜欢

热点阅读