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

