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. TP5.1教程第十章三小节的用户注册章节,不能显示bootstrap的菜单下拉,也不能script验2. 怎样使留言的数据与登录的用户名,密码保持一致(在数据库上是一行的)。3. css - sudo gem install jekyII 出现错误4. 前端 - 访问Apache文档目录下的HTML文件变成了下载该页面?5. win10 Apache24+PHP8.0,Apache不能正常加载php.ini。6. html - css气泡,实现“倒三角(不知道算不算三角了)”可透明的。7. angular.js - vue or angular.2 or react8. 如何通过Java编码生成Jmeter仪表板报告(不是Windows或Shell命令)9. PHP中的$this代表当前的类还是方法?10. PHP类封装的插入数据,总是插入不成功,返回false;
