博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android内存泄露的原因
阅读量:4290 次
发布时间:2019-05-27

本文共 1168 字,大约阅读时间需要 3 分钟。

小山拉家常
2016-10-16 23:13
  1. 资源对象没关闭。

    如Cursor、File等资源。他们会在finalize中关闭,但这样效率太低。容易造成内存泄露。

    SQLiteCursor,当数据量大的时候容易泄露

  2. 使用Adapter时,没有使用系统缓存的converView。

  3. 即时调用recycle()释放不再使用的Bitmap。

    适当降低Bitmap的采样率,如:

    BitmapFactory.Options options = newBitmapFactory.Options();

    options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一

    Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);

  4. 使用application的context来替代activity相关的context,不要让生命周期长于Activity的对象持有到Activity的引用。尽量避免activity的context在自己的范围外被使用,这样会导致activity无法释放。

  5. 注册没取消造成内存泄露

    如:广播

  6. 集合中的对象没清理造成的内存泄露我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了。

  7. Handler应该申明为静态对象, 并在其内部类中保存一个对外部类的弱引用。如下:

    static class MyHandler extends Handler {

    WeakReference<Activity > mActivityReference;

    MyHandler(Activity activity){

    mActivityReference= new WeakReference<Activity>(activity);

    }

    @Override

    public void handleMessage(Message msg){

    final Activity activity = mActivityReference.get();

    if (activity != null){

    mImageView.setImageBitmap(mBitmap);

    }

    }

    }

  8. 尽量不要在Activity中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用(具体可以查看细话Java:”失效”的private修饰符了解)。如果使用静态内部类,将外部实例引用作为弱引用持有。

其他相关的内容欢迎童鞋们评论补充哦~

转载地址:http://cjggi.baihongyu.com/

你可能感兴趣的文章
消息队列 mq 必会面试题
查看>>
线程池的工作原理是啥?能手写一个线程池吗?
查看>>
Java程序内存的简单分析
查看>>
Javascript单例模式概念与实例
查看>>
SQL NULL 函数
查看>>
多例设计模式
查看>>
WebView的JavaScript与本地代码三种交互方式
查看>>
WebView的JavaScript与本地代码三种交互方式
查看>>
Android Studio里面配置Tesseract
查看>>
深入浅出JavaScript之this
查看>>
Android include标签的使用注意事项
查看>>
final成员变量和final局部变量
查看>>
Android数据加密之异或加密算法
查看>>
greenDao好的示例网址
查看>>
Android自定义控件--仿安全卫士中的一键加速
查看>>
Android Tools Attributes,让布局设计所见即所得
查看>>
Android内存泄露的原因
查看>>
Java并发总结
查看>>
JavaScript筑基篇(二)->JavaScript数据类型
查看>>
干货:Java几种线程池的分析和使用。
查看>>