内存泄露-问题分析

Handler 匿名内部类、非静态内部类

静态内部类

如何避免

1:使用静态内部类,加上static 修饰

2:使用WeakReference

private static class MyHandler extends Handler {
    WeakReference<HandlerActivity> weakReference;

    public MyHandler(HandlerActivity activity) {
        weakReference = new WeakReference<HandlerActivity>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if (weakReference.get() != null) {
            ...
        }
    }
}

3:根据业务情况在 onDestroy 中移除回调、取消异步任务

  protected void onDestroy() {
    super.onDestroy();
    myHandler.removeCallbacksAndMessages(null);
    myAsyncTask.cancel(true ) ;
  }

静态变量

静态变量

静态变量的生命周期是在类加载时开始,类卸载时结束。进程没有被杀死,静态变量就会一直存在。 如果静态变量强应用了 Activity 中的变量,那当这个 Activity 销毁也不会被释放。

如何避免

1.寻找和静态变量生命期差不多的替代
如 单例中的 context 使用 ApplictionContext 代替

2.强引用改成弱引用

如 WeakHashMap WeakReference

监听器有 add 没有 remove

监听器 remove

如何避免

1.onDestroy 时调用 remove

2.使用 WeakReference (不推荐, 优先调用 remove 来解决,谁创建谁回收)

3.考虑使用 EventBus ??

WeakReference

资源未关闭

使用了BraodcastReceiver, Cursor, Bitmap,ContentObserver,Callback 等资源,当不再需要时,需要释放掉

代码方面的问题

1.Bitmap 没有 recycle

2.Adapter 没有使用 converView

3.注册事件没有 remove

4.其他(待补充。。。)

原文地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    _痞子阅读 1,694评论 0 8
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    apkcore阅读 1,303评论 2 7
  • 一、基础知识 1、什么是内存泄露 java中的内存泄露是指一个无用对象持续占有内存或无用对象的内存得不到及时的释放...
    LiveMoment阅读 4,514评论 0 20
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    宇宙只有巴掌大阅读 2,479评论 0 12
  • 前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想...
    EsonJack阅读 1,306评论 1 3

友情链接更多精彩内容