Android getActivity()为空的问题解决办法
AndroidgetActivity()为空的问题解决办法
在开发项目中有时会碰到getActivity函数为空的情况, 导致apk空指针崩溃问题, 看代码逻辑没有明显的原因。
如果看Activity.Java、FragmentActivity.java的源码就可以找到原因。当activity实例在后台时,系统在回收资源时很可能回收掉Activity, 并在onSaveInstanceState函数里保存fragment的状态,再次打开该Activity时,在onCreate方法里取出bundle里的fragment状态,但这时fragment对应的Activity早就不在了,所以getActivity为空。
摘自FragmentActivity.java:
protectedvoidonCreate(BundlesavedInstanceState){
.......
if(savedInstanceState!=null){
Parcelablep=savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreAllState(p,nc!=null?nc.fragments:null);
}
mFragments.dispatchCreate();
}
protectedvoidonSaveInstanceState(BundleoutState){
super.onSaveInstanceState(outState);
Parcelablep=mFragments.saveAllState();
if(p!=null){
outState.putParcelable(FRAGMENTS_TAG,p);
}
}
从源码可以看出解决方案:1、 覆盖onSaveInstanceState函数,不保存到bundle;2、 覆盖onCreate方法,删除FRAGMENTS_TAG参数。(注意:Activity和FragmentActivity对FRAGMENTS_TAG的定义不同)
例如:
publicclassTestActivityextendsFragmentActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
if(savedInstanceState!=null){
savedInstanceState.remove("android:support:fragments");//注意:基类是Activity时参数为android:fragments,一定要在super.onCreate函数前执行!!!
}
super.onCreate(savedInstanceState);
...
}
//或者
protectedvoidonSaveInstanceState(BundleoutState){
//super.onSaveInstanceState(outState);//注释掉该方法,即不保存状态
}
以上就是AndroidgetActivity()为空的问题解决办法的讲解,如有疑问请大家留言或到本站社区讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
热门推荐
10 财运虎年祝福语简短语
11 单亲爸爸春节祝福语简短
12 狗狗上厕所训练
13 植物种植祝福语简短
14 翻译考试祝福语朋友简短
15 个人周年庆简短祝福语
16 狗狗怎么训练
17 分别祝福语简短搞笑英文
18 生日广州男生祝福语简短