android - 為什么重復(fù)Replace Fragment會(huì)內(nèi)存泄漏
問(wèn)題描述
如圖,當(dāng)點(diǎn)擊下面的兩個(gè)按鈕時(shí),REPALCE上面的Fragmnet,共兩個(gè),反復(fù)切換時(shí)發(fā)生了內(nèi)存泄漏
這是Fragment的代碼:
public class Fragment2 extends Fragment { private List<Bitmap> lb = new ArrayList<>(); @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {allocBitMap();allocBitMap();return inflater.inflate(R.layout.f2, container, false); } private void allocBitMap() {Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.men);lb.add(b); } @Override public void onDestroy() {Log.e('onDestroy', 'yes, onDestroy');super.onDestroy(); }}
這是Activity的部分代碼
@Override public void onClick(View v) {switch (v.getId()) { case R.id.bt_left:transFragleft();break; case R.id.bt_right:transFragright();break;} } Fragment f1 = new Fragment1(); Fragment f2 = new Fragment2(); private void transFragleft(){FragmentTransaction ft = getSupportFragmentManager().beginTransaction();ft.replace(R.id.rl_f, f1);ft.commit(); } private void transFragright(){FragmentTransaction ft = getSupportFragmentManager().beginTransaction();ft.replace(R.id.rl_f, f2);ft.commit(); }
這是反復(fù)切換時(shí)的內(nèi)存狀態(tài):
這是LOGCAT,可以看到onDestroy執(zhí)行了,整個(gè)Fragment生命周期馬上就結(jié)束了
04-27 09:46:04.682 29320-29320/com.sg.fragmentpitfall E/onDestroy: yes, onDestroy04-27 09:46:06.344 29320-29320/com.sg.fragmentpitfall E/onDestroy: yes, onDestroy04-27 09:46:07.895 29320-29320/com.sg.fragmentpitfall E/onDestroy: yes, onDestroy
那么為什么他占用的那塊內(nèi)存還在呢?
提問(wèn)2:JAVA中怎樣分配一定內(nèi)存,用于實(shí)驗(yàn),我這種bitmap的方法太LOW了,而且里面還有CONTEXT;
提問(wèn)3:是否應(yīng)該避免使用FRAGMENT(我知道用HIDE/SHOW的方式要比REPLACE要好
謝謝!
問(wèn)題解答
回答1:把LeakCanary集成到代碼里面,看看是什么原因?qū)е碌膬?nèi)存泄露。而且內(nèi)存圖上升,也不一定就是內(nèi)存泄露。你每次申請(qǐng)了Bitmap,沒(méi)準(zhǔn)沒(méi)達(dá)到GC的標(biāo)準(zhǔn),那內(nèi)存一直上漲也沒(méi)問(wèn)題。
回答2:不是 fragment 的問(wèn)題,而是你用的bitmap 的原因
相關(guān)文章:
1. mysql - 這條聯(lián)合sql語(yǔ)句哪里錯(cuò)了2. mysql優(yōu)化 - 關(guān)于mysql分區(qū)3. 請(qǐng)教各位大佬,瀏覽器點(diǎn) 提交實(shí)例為什么沒(méi)有反應(yīng)4. java - Atom中文問(wèn)題5. java - MySQL中,使用聚合函數(shù)+for update會(huì)鎖表嗎?6. css3 - 這個(gè)形狀使用CSS怎么寫(xiě)出來(lái)?7. javascript - 為什么這個(gè)點(diǎn)擊事件需要點(diǎn)擊兩次才有效果8. node.js - 在vuejs-templates/webpack中dev-server.js里為什么要exports readyPromise?9. javascript - ionic2 input autofocus 電腦成功,iOS手機(jī)鍵盤(pán)不彈出10. java - C語(yǔ)言算法題-韓信點(diǎn)兵 求解?
