Android 解決fragment 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
Android 中 Fragment 巢狀 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
android之Fragment的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