1. 程式人生 > >Android-記憶體不足導致了Fragment的主Activity銷燬Fragment顯示重疊

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-記憶體不足導致FragmentActivity銷燬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(ActivityFragment之間的通訊)

從Fragment往Activity方向的通訊的思路:Fragment ----> Activity :---- 需要在Fragment內部定義一個回撥介面,然後讓包含該Fragment的Activity實現該回調介面,這樣Fragment就可以呼叫該回調方法將資料傳遞

Android】安卓開發之activity如何傳值到fragmentactivityfragment傳值

作者:程式設計師小冰,GitHub主頁:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 大家知道,我們利用acti

Android重新開啟APP應用程式或activityfragment 重疊問題

問題發生的場景: 螢幕旋轉 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 FragmentActivity交互,互相發數據(附圖具體解釋)

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 特別大的ActivityFragment的生命周期圖

div size img tail 分享 tex 哈哈 blank dsm 這麽 這麽大的圖。不做太多解釋,哈哈,真的是棒棒的。 代碼測試下載:http://download.csdn.net/detail/pcaxb/8906085

Android ActivityFragment的生命周期圖

sso mar popu data con b2c post pos alt Android Activity和Fragment的生命周期圖

android--------實現ActivityFragment通信的面向對象的萬能接口

inter strong .sh state alt mage 技術 content allow 前言 開發一個app時,常用Activity和Fragment,由於操作方便Fragment越來越受歡迎,這樣就避免不了Activity和Fragment、Fragment和F

Android進階之FragmentActivity之間的數據交互

|| int tails support 實例 onclick interface rod sel 1 為什麽 因為Fragment和Activity一樣是具有生命周期,不是一般的bean通過構造函數傳值,會造成異常。 2 Activity把值傳遞給Fragment 2.1

Android 元件之FragmentActivity通訊小述

一、概述 本節主要介紹一下Fragment與Activity的互動方式,當然方法肯定並不是唯一的,我在這裡只是將自己平時的思路記錄一下,算是拋磚引玉 二、Fragment接收Activity傳遞的資料 我們想從Fragment內獲取它的託管Activity中的資料,這種情況我

Android 點選空白處自動隱藏輸入法,適用於activityfragment和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重疊現象,其實出現問題的原因是這樣的,