前段时间,发现一个问题,就是当应用发生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?
答案显而易见。可以肯定是一定的。曾经一直出现的莫名其妙的白屏,我都误认为是崩溃了,一直都无法彻底根除,知道现在明白的原由,才发现原来一直都走错了。
网友评论