android - 為什么重復Replace Fragment會內存泄漏
問題描述
如圖,當點擊下面的兩個按鈕時,REPALCE上面的Fragmnet,共兩個,反復切換時發生了內存泄漏
這是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(); }
這是反復切換時的內存狀態:
這是LOGCAT,可以看到onDestroy執行了,整個Fragment生命周期馬上就結束了
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
那么為什么他占用的那塊內存還在呢?
提問2:JAVA中怎樣分配一定內存,用于實驗,我這種bitmap的方法太LOW了,而且里面還有CONTEXT;
提問3:是否應該避免使用FRAGMENT(我知道用HIDE/SHOW的方式要比REPLACE要好
謝謝!
問題解答
回答1:把LeakCanary集成到代碼里面,看看是什么原因導致的內存泄露。而且內存圖上升,也不一定就是內存泄露。你每次申請了Bitmap,沒準沒達到GC的標準,那內存一直上漲也沒問題。
回答2:不是 fragment 的問題,而是你用的bitmap 的原因
相關文章:
1. 這是什么情況???2. html5 - h5頁面在iphone上字體變形3. 開了mc服務器但是不會全服同步數據4. javascript - 微信公號里采用七牛上傳視頻部分手機不能選擇文件5. css - input中transition 設置background-color過渡,chrome瀏覽器頁面初始化渲染會有過度效果6. php - localstroage和cookie在手機微信端,能存進去卻無法在其他頁面調用7. 好奇,求大神解答,類似淘寶的大購物量網站,訂單數據表該怎么設計?8. python 計算兩個時間相差的分鐘數,超過一天時計算不對9. javascript - vue過渡效果 css過渡 類名的先后順序10. vue.js默認值,如何相加
