Android getActivity()為空的問(wèn)題解決辦法
Android getActivity()為空的問(wèn)題解決辦法
在開發(fā)項(xiàng)目中有時(shí)會(huì)碰到getActivity函數(shù)為空的情況, 導(dǎo)致apk空指針崩潰問(wèn)題, 看代碼邏輯沒有明顯的原因。
如果看Activity.Java、FragmentActivity.java的源碼就可以找到原因。 當(dāng)activity實(shí)例在后臺(tái)時(shí), 系統(tǒng)在回收資源時(shí)很可能回收掉Activity, 并在onSaveInstanceState函數(shù)里保存fragment的狀態(tài), 再次打開該Activity時(shí), 在onCreate方法里取出bundle里的fragment狀態(tài), 但這時(shí)fragment對(duì)應(yīng)的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函數(shù), 不保存到bundle; 2、 覆蓋onCreate方法, 刪除FRAGMENTS_TAG參數(shù)。(注意:Activity和FragmentActivity對(duì)FRAGMENTS_TAG的定義不同)
例如:
public class TestActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { savedInstanceState.remove("android:support:fragments"); //注意:基類是Activity時(shí)參數(shù)為android:fragments, 一定要在super.onCreate函數(shù)前執(zhí)行!?。? } super.onCreate(savedInstanceState); ... } //或者 protected void onSaveInstanceState(Bundle outState) { //super.onSaveInstanceState(outState); //注釋掉該方法, 即不保存狀態(tài) }
以上就是Android getActivity()為空的問(wèn)題解決辦法的講解,如有疑問(wèn)請(qǐng)大家留言或到本站社區(qū)討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
android編程實(shí)現(xiàn)添加文本內(nèi)容到sqlite表中的方法
這篇文章主要介紹了android編程實(shí)現(xiàn)添加文本內(nèi)容到sqlite表中的方法,結(jié)合實(shí)例較為詳細(xì)的分析了Android針對(duì)txt文本文件的讀取及SQL數(shù)據(jù)庫(kù)操作的相關(guān)技巧,需要的朋友可以參考下2015-11-11詳解Retrofit Interceptor(攔截器) 攔截請(qǐng)求并做相關(guān)處理
本篇文章主要介紹了詳解Retrofit Interceptor(攔截器) 攔截請(qǐng)求并做相關(guān)處理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Android編程使用android-support-design實(shí)現(xiàn)MD風(fēng)格對(duì)話框功能示例
這篇文章主要介紹了Android編程使用android-support-design實(shí)現(xiàn)MD風(fēng)格對(duì)話框功能,涉及Android對(duì)話框、視圖、布局相關(guān)操作技巧,需要的朋友可以參考下2017-01-01Android如何創(chuàng)建可拖動(dòng)的圖片控件
這篇文章主要為大家詳細(xì)介紹了Android如何創(chuàng)建可拖動(dòng)的圖片控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Android性能優(yōu)化之Bitmap圖片優(yōu)化詳解
在Android項(xiàng)目的imageview中使用大圖bitmap時(shí)會(huì)占據(jù)很大的內(nèi)存,而且在很多時(shí)候我們并不需要顯示原圖那么大的圖片, 所以我們需要對(duì)圖片進(jìn)行優(yōu)化,這篇文章主要介紹了Android性能優(yōu)化之Bitmap圖片優(yōu)化的相關(guān)資料,需要的朋友們下面來(lái)一起看看吧。2017-04-04Android 通過(guò)騰訊TBS實(shí)現(xiàn)文件預(yù)覽功能
這篇文章主要介紹了Android 通過(guò)騰訊TBS實(shí)現(xiàn)文件預(yù)覽功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Android內(nèi)存泄漏檢測(cè)工具LeakCanary
在Android的性能優(yōu)化中,內(nèi)存優(yōu)化是必不可少的點(diǎn),而內(nèi)存優(yōu)化最重要的一點(diǎn)就是解決內(nèi)存泄漏的問(wèn)題,在Android的內(nèi)存泄漏分析工具也不少,比如PC端的有:AndroidStudio自帶的Android?Profiler、MAT等工具;手機(jī)端也有,就是我們今天要介紹的LeakCanary2023-04-04