Android getActivity()為空的問題解決辦法
在開發項目中有時會碰到getActivity函數為空的情況, 導致apk空指針崩潰問題, 看代碼邏輯沒有明顯的原因。
如果看Activity.Java、FragmentActivity.java的源碼就可以找到原因。 當activity實例在后臺時, 系統在回收資源時很可能回收掉Activity, 并在onSaveInstanceState函數里保存fragment的狀態, 再次打開該Activity時, 在onCreate方法里取出bundle里的fragment狀態, 但這時fragment對應的Activity早就不在了, 所以getActivity為空。
摘自FragmentActivity.java:
protected void onCreate(Bundle savedInstanceState) { ....... if (savedInstanceState != null) { Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG); mFragments.restoreAllState(p, nc != null ? nc.fragments : null); } mFragments.dispatchCreate(); } protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Parcelable p = mFragments.saveAllState(); if (p != null) { outState.putParcelable(FRAGMENTS_TAG, p); } }從源碼可以看出解決方案: 1、 覆蓋onSaveInstanceState函數, 不保存到bundle; 2、 覆蓋onCreate方法, 刪除FRAGMENTS_TAG參數。(注意:Activity和FragmentActivity對FRAGMENTS_TAG的定義不同)
例如:
public class TestActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { savedInstanceState.remove("android:support:fragments"); //注意:基類是Activity時參數為android:fragments, 一定要在super.onCreate函數前執行!!! } super.onCreate(savedInstanceState); ... } //或者 protected void onSaveInstanceState(Bundle outState) { //super.onSaveInstanceState(outState); //注釋掉該方法, 即不保存狀態 } 以上就是Android getActivity()為空的問題解決辦法的講解,如有疑問請大家留言或到本站社區討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答