1. 程式人生 > >Android 解決fragment replace方法低效的問題

Android 解決fragment replace方法低效的問題

剛開始學android的時候,對於fragment的切換問題,理所當然的使用FragmentTransaction中的replace方法來解決,但是這個方法時非常低效的,我們先來看官方文件對於這個方法的介紹:

replace

Replace an existing fragment that was added to a container. This is essentially the same as calling  for all currently added fragments that were added with the same containerViewId and then  with the same arguments given here.

簡單的翻譯一下:替換一個已經被新增進容器的fragment,其本質與對所有已經新增進同一個id的容器(xml檔案中的FrameLayout)的fragment呼叫remove(Fragment)方法然後呼叫add方法想要替換的fragment是相同的。

可以看出,呼叫replace的話,會先將原本處於容器中的fragment全部丟掉,然後再新增一個新的fragment,這樣在每次replace的時候就會進行一次初始化,非常低效

     if (fragment == null) {
            fragment = ActionFragment.newInstance();
        }
        FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.content_frame_card, fragment);
        transaction.commit();

這段程式碼就是使用replace方法,我們在android monitor中看執行的時候瘋狂點選切換的話記憶體會怎麼樣


可以看到,一開始記憶體的上升速度很快,雖然期間有GC工作,但是對於整個上升的趨勢並沒有很大的影響,後面停止點選記憶體趨於平穩,最後我手動呼叫了幾次GC,記憶體迅速下降,雖然沒有導致記憶體洩漏的問題,但是毫無疑問這個辦法是很低效不可取的方法。

那麼圖和解決呢?我們可以參考點選開啟連結這篇文章中的解決方法,採用hide和show來實現fragment的替換

public static void replaceFragment(FragmentManager manager, Fragment to, int fgmId) {
        FragmentTransaction transaction = manager.beginTransaction();
        //遍歷隱藏所有新增的fragment
        for (Fragment fragment : manager.getFragments()) {
            transaction.hide(fragment);
        }
        if (!to.isAdded()) { //若沒有新增過
            transaction.add(fgmId, to).commit();
        } else { //若已經新增
            transaction.show(to).commit();
        }

    }


可以看到這一次在快速連續點選切換的情況下,記憶體沒有明顯的上升,上升趨勢非常緩慢,且後面手動進行一次GC即可,這種方法很好的解決了replace的低效問題和切換時候的重疊問題

相關推薦

Android 解決fragment replace方法低效的問題

剛開始學android的時候,對於fragment的切換問題,理所當然的使用FragmentTransaction中的replace方法來解決,但是這個方法時非常低效的,我們先來看官方文件對於這個方法的介紹: replace Replace an existin

Android - 解決Fragment + ViewPager的生命週期問題

public class FragmentVisibleHelper implements LifecycleObserver { private static final String TAG = "VisibleHelper"; public interface

簡述Android 解決65536/64K方法數限制方案

在Android專案開發中,尤其是開發類似淘寶,京東,微信,直播等大型專案中,由於產品的迭代,業務模組的快速增長,到了一定的規模後難免會遇到65536/64K方法數的問題。 它是個什麼鬼? 這個問題,網上還有其他人說65方法數問題,本質上都市指Andro

Android fragment.replace()第一個引數不能真正替換的解決方法

在用tabhost切換fragment的時候,會用到切換fragment的,Android fragment .replace()的第一個引數要選對 首先貼一段佈局檔案  <RelativeLayout xmlns:android="http://schemas

ANDROID FRAMENT的切換(解決REPLACE低效

原博主:https://www.cnblogs.com/android-joker/p/4414891.html在專案中切換Fragment,一直都是用replace()方法來替換Fragment。但是這樣做有一個問題,每次切換的時候Fragment都會重新實列化,重新載入一

Android 使用android-support-multidex解決Dex超出方法數的限制問題,讓你的應用不再爆棚

動態改變 配置 移動 back mis 文件的 文件格式 .info jar包 如有轉載,請聲明出處: 時之沙: http://blog.csdn.net/t12x3456 (來自時之沙的csdn博客) 隨著應用不斷叠代,業務線的擴

Android使用Fragment,不能得到Fragment內部控件,findViewById()結果是Null--已經解決

文本 match ces ear creat 能夠 -s 兼容 mat 程序很easy。好長時間沒有搞定。郁悶。。。。。。。。。。。。在論壇咨詢,最終找到答案。 描寫敘述: 一個Activity:MainActivity。內部是一個Fragment:FragmentA。

android 解決連接電視機頂盒失敗的方法

com conf src set ice 分享 找到 正常 原因 今天在開發過程中,需要連接海美迪的電視盒子,這個盒子是基於android6.0的版本,之前連接其它電視盒子都正常,當輸入 adb -s xxxx shell後,盒子連接失敗,日誌如下: error: devi

AndroidFragment 巢狀 Fragment使用存在的bug附完美解決方案

原文地址:https://blog.csdn.net/u014365133/article/details/73176068 自從Android3.0引入了Fragment之後,使用Activity去巢狀一些Fragment的做法也變得更加流行,這確實是Fra

Android HorizontalListView並且解決了setSelection方法

import android.content.Context; import android.database.DataSetObserver; import android.graphics.Rect; import android.util.AttributeSet; import androi

android.app.Fragment$InstantiationException異常的解決方案

可編譯通過,但是執行的時候就crash。 異常堆疊: (181130_17:03:40.550)11-29 15:48:54.149 3202 3202 E AndroidRuntime: Process: com.android.settings, PID: 3202 (18113

Android 關於fragment切換重新載入的解決分享給大家

在專案中需要進行Fragment的切換,一直都是用replace()方法來替換Fragment 但是,這樣會有一個問題 ,應該很多朋友都遇到過: 每次切換的時候,Fragment都會重新例項化,也就是執行OnCreatVIew()方法 那麼如何讓多個Fragment彼此切換時不重新例項

Android 解決ListView巢狀GridView、GridView顯示不正常的方法

自定義View,繼承GridView,重寫onMeasure()方法,程式碼如下: public class MyGridView extends GridView { public MyGridView(Context context) {

解決replace()方法只能替換第一個字元

問題描述:Flex/Flash中字串有replace()方法,可以方便的替換字串,比如我想把一個字串裡的”:”都替換成”_” var fileName:String = "18:18:20"; fileName = fileName.replace(":","

android開發過程中解決bug的方法

1、判斷手機型號 2、判斷手機版本號 1、解決魅藍3手機軟鍵盤不能頂上去佈局的問題 if (Build.MODEL.equals(“m3”)){ Log.i(“LHD”,”connect魅族3手機”);

Android 解決螢幕旋轉時重啟onCreate方法

在對應的Activity註冊的時候新增 android:configChanges="orientation|keyboardHidden|screenSize" 就行了。 還可以在這個Activity中新增如下程式碼對螢幕旋轉進行監聽: @Override

required 'Android.support.v4.app.Fragment' found 'android.app.Fragment.'錯誤解決

跟著網上教程一步一步的做一個andriod studio例子 結果在 FragmentTransaction fTransaction = fManager.beginTransaction();報錯:  required 'Android.support.v4.app.F

Android】required 'Android.support.v4.app.Fragment' found 'android.app.Fragment.'錯誤解決

跟著網上教程一步一步的做一個andriod studio例子 結果在 FragmentTransaction fTransaction = fManager.beginTransaction();報錯: required 'Android.support.v4.app.Fra

androidFragment的bug解決

最近做一個功能,當第二次進入一個介面的時候出現一個奇怪的bug,如下面詳細的log資訊: 10-01 13:36:23.549: E/AndroidRuntime(14188): Process: com.android.settings, PID: 14188 10-01

Android開發建Fragment正確方法

經常看到fragment是new出來的,且引數都放在構造方法裡面傳遞,雖然不報錯,但總感覺不對勁。         正確方法:         public static MatcherRecordF