android技术Android开发经验谈Android开发

静态内部类的生命周期

2017-06-29  本文已影响142人  android_cyw

最近在研究内存泄漏的过程中偶然发现一个问题:我们通过Builder这种构建者的方式(这个Builder是个静态内部类)去构建一个参数对象是否会引发内存泄漏的风险(即静态内部类的生命周期是怎样的)?核心代码如下:

public class ImageLoader {

    private Context context;

    public ImageLoader(Builder builder) {
        this.context = builder.context;
    }

    public Context getContext() {
        return context;
    }
    

    public static class Builder {
    
        private Context context;

        public Builder with(Context context) {
            this.context = context;
            return this;
        }

        public ImageLoader build() {
            return new ImageLoader(this);
        }

    }
}

1.静态内部类应该是一开始就创建了并且会一直存在内存中

2.所有的外部类实例共享这个静态内部类

3.静态会不会造成我的上下文(假设传递过来的是activity对象)泄漏

带着这些疑问,我做了如下的改动:

public class ImageLoader {

    private Context context;

    static {
        Log.e("cyw", "ImageLoader静态代码块");
    }

    public ImageLoader(){
        Log.e("cyw", "ImageLoader构造方法");
    }

    public ImageLoader(Builder builder) {
        this.context = builder.context;
    }

    public Context getContext() {
        return context;
    }
    

    public static class Builder {
    
        private Context context;

        static {
            Log.e("cyw", "Builder静态代码块");
        }
        
        public Builder(){
            Log.e("cyw", "Builder构造方法");
        }


        public Builder with(Context context) {
            this.context = context;
            return this;
        }

        public ImageLoader build() {
            return new ImageLoader(this);
        }

    }
}

日志.png
上一篇 下一篇

猜你喜欢

热点阅读