Android开发超常见的内存泄露以及解决

什么是内存泄露?GC无法回收原本应该被回收的对象,这个对象就引发了内存泄露

1.Bitmap使用完忘记回收,因为bitmap实现部分是通过JNI调用了Native方法,GC机制无法正常回收 Bitmap申请的这部分内存空间(API10之前是这样的,之后分配在Heap中,不过为了兼容老版本...显示的调用一下recycled,也能让GC更快的回收调自己);

那Bitmap应该怎样回收呢?

  1. // bitmap!=null要放在前面,如果bitmap为空再去调用isRecycled方法便会报错
  2. if(bitmap!=null&&!bitmap.isRecycled){
  3. bitmap.recycled; //回收bitmap
  4. bitmap = null//使bitmap对象变为虚引用的状态,让GC更快的回收
  5. }

接下来,讲两个更为常见的内存泄露,大家根据这两个可以自行扩展

  1. btn_hint.setOnClickListener(new View.OnClickListener {
  2. @Override
  3. public void onClick(View v) {
  4. Toast.makeText(MainActivity.this"Hello", Toast.LENGTH_SHORT).show;
  5. }
  6. });

是不是很常见,平时可能也是这样写的(将其封装意义一样,只要引用了当前activity),你可能想问,这里有什么问题吗?

问题在于如果用户在Toast消失之前,用户按了返回键,这个Activity就引起了内存泄露,

原因? Toast持有了当前Activity,导致Activity无法被GC销毁

解决方法:让Toast持有ApplicationContext;其实只要不是Layout,Context都可以使用ApplicationContext;

顺便讲个小技巧:在非Activity中,正常是不能直接getContext来拿到Context的,获取资源有需要靠Context,这时可以考虑在自己的Application中维护一个全局的Context,供无法直接拿到Context的类使用,省的参数传来传去(视图相关的不建议使用ApplicationContext)

  1. private static Context mContext;
  2. public static MyApplication getInstance { //供外界调用...
  3. return mApplication;
  4. }
  5. @Override
  6. public void onCreate {
  7. super.onCreate;
  8. mContext = getApplicationContext;
  9. }

另一个常见的...内存泄露

  1. new Thread {
  2. public void run {
  3. //网络请求
  4. };
  5. }.start;

这里也有问题?你tm逗我?

在Activity中 新建一个线程,进行网络请求,如果线程未结束,用户按了返回键,同样内存泄露

原因:该Thread是匿名内部类,所以会隐式的持有外部类(这里也就是Activity)

解决方式:多种多样; 不使用匿名内部类,或者整个应用维护一个线程池,或者维护一个线程队列,后两种都是让线程不依赖于Activity从而达到避免内存泄露的目的;

资源获取等等很多地方都需要用到Context,很多地方都会用到匿名内部类,这也就导致了这里存在很大的内存泄露隐患,但平时很多小伙伴可能还没有注意到,希望这篇文章能给你一些启发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值