美文网首页
私有内部类导致内存泄漏

私有内部类导致内存泄漏

作者: e小e | 来源:发表于2017-10-19 13:26 被阅读178次

前几天在修复电池项目内存泄漏的地方学到了一个新的知识点.

私有内部类(匿名的私有内部类也算)中会有一个外部类的引用,那么当内部类对象没有被销毁,外部类也不会被销毁,这一点很容易忽略从而造成内存泄漏.

代码如下:这样的匿名内部类使用会导致OutOfMemActivity的内存泄漏

public class OutOfMemActivity extends Activity implements View.OnClickListener{

    public static final String ACTION_INTENT_FILTER = "ACTION_INTENT_FILTER";

    private Button btn;

    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            new Thread(){
                @Override
                public void run() {
                    super.run();
                    while (true){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        Log.i("tag","running ... "+OutOfMemActivity.this);
                    }
                }
            }.start();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_out_of_mem);
        btn = (Button)findViewById(R.id.btn_send);
        btn.setOnClickListener(this);
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(ACTION_INTENT_FILTER);
        registerReceiver(broadcastReceiver,intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(broadcastReceiver);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_send:
                Intent intent = new Intent();
                intent.setAction(ACTION_INTENT_FILTER);
                sendBroadcast(intent);
                break;
        }
    }
}

我们可用通过弱引用解决该问题(关于强引用,软引用,弱引用,虚引用传送门https://my.oschina.net/ydsakyclguozi/blog/404389),我们改写这个广播接收器使它成为静态内部类如下:

private static class MyBroadcastReceiver extends BroadcastReceiver{



    private WeakReference<OutOfMemActivity> outOfMemActivityWeakReference;

    public MyBroadcastReceiver(WeakReference<OutOfMemActivity> outOfMemActivityWeakReference) {

        this.outOfMemActivityWeakReference = outOfMemActivityWeakReference;
    }



    @Override
    public void onReceive(Context context, Intent intent) {

        new Thread(){

            @Override
            public void run() {

                super.run();
                while (true){

                    try {

                        Thread.sleep(1000);
                    } catch (InterruptedException e) {

                        e.printStackTrace();
                    }

                    OutOfMemActivity outOfMemActivity = outOfMemActivityWeakReference.get();
                    Log.i("tag","running ... "+outOfMemActivity);
                }

            }

        }.start();
    }

}

这样如果使用OutOfMemActivity对象,它是以弱引用传送进来,在垃圾回收器扫描到该对象的时候就会回收掉它.

相关文章

  • 私有内部类导致内存泄漏

    前几天在修复电池项目内存泄漏的地方学到了一个新的知识点. 私有内部类(匿名的私有内部类也算)中会有一个外部类的引用...

  • Android内存优化——常见内存泄露及优化方案

    内存泄漏情况分类 1、单例模式导致内存泄漏 2、静态变量导致内存泄漏 3、非静态内部类导致的内存泄漏 4、未取消注...

  • Android常见内存泄漏汇总

    目录:一、内存泄漏介绍二、常见内存泄漏场景1.单例导致内存泄露2.静态变量导致内存泄漏3.非静态内部类导致内存泄露...

  • 内存泄露

    什么是内存泄漏? 引用导致的对象未被释放 引起内存泄漏的因素: 单例 非静态内部类持有外部类的隐式引用,而在外部类...

  • Android内存泄漏

    1. 内部类隐性的持有外部类的引用导致内存泄漏 private Handler Myhander=new Hand...

  • 私有内部类导致内存泄漏的解决方案

    前言 前几天在修复电池项目内存泄漏的地方学到了一个新的知识点. 私有内部类(匿名的私有内部类也算)中会有一个外部类...

  • 在Activity、fragment使用new Thread导致

    以上方法会浪费线程资源,极有可能导致内存泄漏,解决方法有两种: 1.把该线程类声明为私有的静态内部类:

  • Handler的正确使用姿势

    为了避免因为handler持有activity导致的内存泄漏 可以将内部类写成静态内部类 static class...

  • 私有内部类导致内存泄漏解决方案

    前几天在修复电池项目内存泄漏的地方学到了一个新的知识点. 私有内部类(匿名的私有内部类也算)中会有一个外部类的引用...

  • Android 优化

    Android 内存优化内存溢出 , 内存泄漏 , 内存泄漏过多就导致内存溢出 Android 系统垃圾回收机制内...

网友评论

      本文标题:私有内部类导致内存泄漏

      本文链接:https://www.haomeiwen.com/subject/znyuuxtx.html