Android-記憶體不足導致了Fragment的主Activity銷燬Fragment顯示重疊
案列
現在很多專案的首頁功能都是用一個Activity去載入多個Fragment去顯示切換內容,列如微信的首頁就是這樣實現的,然後通過調研show和hide方法對Fragment進行顯示隱藏操作,以此達到顯切換識圖。
但現在在筆者的實際專案中遇到了一個問題,當記憶體不足的時候,宿主Activity就會被銷燬,但是Fragment還是被快取下來了,關於Fragment的快取可以看這位博主的文章https://blog.csdn.net/u013588712/article/details/54691791 寫的很清楚,這裡不錯解釋了,當再次呼叫show 和hide的時候發現都失效了,所有的Fragment都重疊在了一起,就會出現顯示問題
解決
只需要自己在savedInstanceState方法中判斷快取,在onCreate的時候根據savedInstanceState是否為空來判斷, 如果不為空直接取快取 為空就走oncreate流程
程式碼
@Override protected void onCreate(Bundle savedInstanceState) { …… if (savedInstanceState != null) { //不為空說明快取檢視中有fragment例項,通過tag取出來 FragmentManager fragmentManager= getFragmentManager(); homeFragment1= (HomeFragment1) fragmentManager.findFragmentByTag("HomeFragment1"); homegment2 = (HomeFragment2) fragmentManager.findFragmentByTag("HomeFragment2"); }else{ homegment1 = findOrCreateFragment("HomeFragment1", HomeFragment1.class); homegment2 = findOrCreateFragment("HomeFragment2", HomeFragment2.class); } ……//資料繫結 } @Nullable private <T extends Fragment> T findOrCreateFragment(String tag, Class<T> fragmentClass) { Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag); if (fragment == null) { try { fragment = fragmentClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); return null; } } return (T) fragment; } /** * 通過該方法切換Fragments **/ private void switchToFragment(int position) { mSelectPosition = position; Fragment showFragment = mFragmentList.get(position); if (showFragment != mLastFragment) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); if (mLastFragment != null) { transaction.hide(mLastFragment); } if (!showFragment.isAdded()) { // 隱藏當前的fragment,顯示選中的fragment transaction.add(R.id.main_container, showFragment, showFragment.getClass().getName()).commitAllowingStateLoss(); } else { // 隱藏當前的fragment,顯示選中的fragment transaction.show(showFragment).commitAllowingStateLoss(); } mLastFragment = showFragment; }
擴充套件
savedInstanceState
onCreate方法的完整定義如下:
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
從上面的程式碼可以看出,onCreate方法的引數是一個Bundle型別的引數。Bundle型別的資料與Map型別的資料相似,都是以key-value的形式儲存資料的。從字面上看savedInstanceState,是儲存例項狀態的。實際上,savedInstanceState也就是儲存Activity的狀態的。那麼,savedInstanceState中的狀態資料是從何處而來的呢?下面我們介紹Activity的另一個方法saveInstanceState。
onsaveInstanceState方法是用來儲存Activity的狀態的。當一個Activity在生命週期結束前,會呼叫該方法儲存狀態。這個方法有一個引數名稱與onCreate方法引數名稱相同。如下所示:
public void onSaveInstanceState(Bundle savedInstanceState){
super.onSaveInstanceState(savedInsanceState);
}
在實際應用中,當一個Activity結束前,如果需要儲存狀態,就在onsaveInstanceState中,將狀態資料以key-value的形式放入到savedInstanceState中。這樣,當一個Activity被建立時,就能從onCreate的引數savedInsanceState中獲得狀態資料。
onSaveInstanceState()這個方法只有在Activity異常銷燬的時候才會呼叫 比如橫豎屏切換出現異常 等等
相關推薦
Android-記憶體不足導致了Fragment的主Activity銷燬Fragment顯示重疊
案列 現在很多專案的首頁功能都是用一個Activity去載入多個Fragment去顯示切換內容,列如微信的首頁就是這樣實現的,然後通過調研show和hide方法對Fragment進行顯示隱藏操作,以此達到顯切換識圖。 但現在在筆者的實際專案中遇到了一個問題,當記憶體不足的
Android6.0以上應用在長時間在後臺,因為記憶體不足導致系統回收記憶體,當再次啟動應用出現Fragment重疊或者空白、異常解決方案(提供模擬記憶體不足導致系統回收記憶體的方案)。
Android6.0以上應用在長時間在後臺,因為記憶體不足導致系統回收記憶體,當再次啟動應用出現Fragment重疊或者空白解決方案。首先提供一個方法模擬記憶體不足導致系統回收記憶體的方案:開啟Android Studio -->Tools-->Android
tomcat伺服器記憶體不足導致的無法連線伺服器問題解決方法
在亞馬遜上申請的1G記憶體+8G硬碟的測試伺服器出現了連線不上伺服器的問題,重啟tomcat之後報錯如下: Using CLASSPATH: /usr/tomcat/apache-tomcat-8.5.15/bin/bootstrap.jar:/usr/
tomcat啟動記憶體不足導致專案不能正常訪問
tomcat啟動時會丟擲一下錯誤,意思是jvm記憶體不足導致不能載入專案的某個元件 Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web applicati
Android中的Fragment ---- 05(Activity和Fragment之間的通訊)
從Fragment往Activity方向的通訊的思路:Fragment ----> Activity :---- 需要在Fragment內部定義一個回撥介面,然後讓包含該Fragment的Activity實現該回調介面,這樣Fragment就可以呼叫該回調方法將資料傳遞
【Android】安卓開發之activity如何傳值到fragment,activity與fragment傳值
作者:程式設計師小冰,GitHub主頁:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 大家知道,我們利用acti
Android重新開啟APP應用程式或activity後fragment 重疊問題
問題發生的場景: 螢幕旋轉 activity被強殺後重啟 應用在後臺被擠出後重新開啟 。。。 產生原因: FragmentState沒有儲存隱藏還是顯示這個狀態,當生命週期又走一次的時候又建立了一次fragment,所以導致重疊 解決方法1:
使用FrameLayout替換Fragment時 不銷燬Fragment
如果使用FragmentManager.beginTransaction().replace().commint().時,被替換的Fragment會被銷燬掉,再次啟動時,之前的資料就會丟失,如果我們只是想暫時切換到其他Fragment中,之後再返回,就需要用Fr
5.0手機使用了WebView的Activity詳情頁面記憶體洩漏導致ANR
問題描述:5.0.1手機使用了WebView的Activity詳情頁面,從列表頁反覆進入詳情頁,出現ANR問題 原因:WebView導致Activity出現記憶體洩漏導致 解決辦法:離開頁面或者銷燬頁面
android Fragment與Activity交互,互相發數據(附圖具體解釋)
oncreate @+ targe save inflate find enter 提交 ransac 筆者最近看官方training。發現了非常多實用又好玩的知識。當中。fragment與Activity通信就是一個。 fragment與Activity通信主要
android開發藝術探索學習 之 結合Activity的生命周期了解Activity的LaunchMode
友情 dsm ask resume () new onstop androi sum 轉載請標明出處: http://blog.csdn.net/lxk_1993/article/details/50749728 本文出自:【lxk_1993的博客】;
Android 特別大的Activity和Fragment的生命周期圖
div size img tail 分享 tex 哈哈 blank dsm 這麽 這麽大的圖。不做太多解釋,哈哈,真的是棒棒的。 代碼測試下載:http://download.csdn.net/detail/pcaxb/8906085
Android Activity和Fragment的生命周期圖
sso mar popu data con b2c post pos alt Android Activity和Fragment的生命周期圖
android--------實現Activity和Fragment通信的面向對象的萬能接口
inter strong .sh state alt mage 技術 content allow 前言 開發一個app時,常用Activity和Fragment,由於操作方便Fragment越來越受歡迎,這樣就避免不了Activity和Fragment、Fragment和F
Android進階之Fragment與Activity之間的數據交互
|| int tails support 實例 onclick interface rod sel 1 為什麽 因為Fragment和Activity一樣是具有生命周期,不是一般的bean通過構造函數傳值,會造成異常。 2 Activity把值傳遞給Fragment 2.1
Android 元件之Fragment與Activity通訊小述
一、概述 本節主要介紹一下Fragment與Activity的互動方式,當然方法肯定並不是唯一的,我在這裡只是將自己平時的思路記錄一下,算是拋磚引玉 二、Fragment接收Activity傳遞的資料 我們想從Fragment內獲取它的託管Activity中的資料,這種情況我
Android 點選空白處自動隱藏輸入法,適用於activity與fragment和Dialog
點選空白處自動隱藏輸入法這個需求很常見,最近也要用到,但是需要處理的頁面很零散的幾個。看到網上的有很多種方法,但是在fragment上會無效,後來發現一中思路,其實也很簡單,就是監聽需要處理介面的父佈局做處理就可以了。理論上無論是哪裡都適用。 <RelativeLayout xmlns
手機記憶體不足?不要胡亂清理了,學會了讓手機空間瞬間釋放!
手機是一款神器的軟體,可以用來聊天溝通,玩遊戲,購物,看書追劇等等,對於手機都會有這樣的一個問題存在,自己的手機才買回來時,不管做什麼都很快速,而一段時間後,手機就會發熱,執行緩慢,很多朋友第一反應就是清理手機,但卻看不懂,也不知道能不能刪除。 今天小編就來幫助大家解決這
Android複習之旅--Activity/Service/Fragment 生命週期
Activity的生命週期 onCreate(Bundle savedlnstanceState) --> 初始化,僅僅被呼叫一次 onStart() --> 開始 onRestart() --> 重置 onResume() --> 獲取焦點 onP
Android中在app被系統釋放後,重新回到前臺時,重建Activity出現Fragment重疊現象
android 開發中Frgment應用場景非常廣泛,應用Fragment是必須使用FragmentActivity,有時候會出現這樣一種情況,在應用退到後臺後,系統會在記憶體不足時將應用回收掉,再次啟動應用會出現Activity中的Fragment重疊現象,其實出現問題的原因是這樣的,