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()为空的问题解决办法的讲解,如有疑问请大家留言或到本站社区讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!