Android Retrofit是否需要使用单例 是否需要在单例中使用weakreference保存Retrofit对象

java单例中使用weakreference的对象是否可以被回收
retrofit是够需要使用单例 将retrofit放入weakreference中

public class RetrofitSingleton {

private WeakReference<Retrofit> retrofitWeakReference;

private RetrofitSingleton() {
}

private static volatile RetrofitSingleton instance = null;

public static RetrofitSingleton getInstance() {
    if (instance == null) {
        synchronized (RetrofitSingleton.class) {
            if (instance == null) {
                instance = new RetrofitSingleton();
            }
        }
    }
    return instance;
}

private synchronized Retrofit getRetrofit() {
    if (retrofitWeakReference == null) {
        OkHttpClient httpClient = new OkHttpClient.Builder()
                .addNetworkInterceptor(new TokenHeadweInterceptor())
                .readTimeout(8, TimeUnit.SECONDS)
                .writeTimeout(8, TimeUnit.SECONDS)
                .connectTimeout(5, TimeUnit.SECONDS)
                .build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constant.URL)
                .client(httpClient)
                .addConverterFactory(GsonConverterFactory.create(GsonUtil.buildGosn()))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();
        retrofitWeakReference = new WeakReference<>(retrofit);
    }
    return retrofitWeakReference.get();
}

}

阅读 6k
5 个回答

会回收,和是否单例无关,只要对象没被其它人引用就会回收。

看你是什么情况要用到weakref,一般情况下保存一个强引用的单例就可以了,一个app下不会有很多个这样的单例

用单例又用弱引用,自相矛盾啊,你应该再学学什么是单例,为什么用单例

  1. java单例中使用weakreference的对象是否可以被回收
弱引用对象的存在不会阻止它所指向的对象变被垃圾回收器回收。弱引用最常见的用途是实现规范映射(canonicalizing mappings,比如哈希表)

简单讲, 就是一个对象只有一个弱引用的指向时, 它是可以被回收的.

2.retrofit是够需要使用单例 将retrofit放入weakreference中.
可以, 但没必要. 另外代码的非空判断也有问题, 没有判断对象是否被回收了.

private synchronized Retrofit getRetrofit() {
    if (retrofitWeakReference == null) {
        *******
        retrofitWeakReference = new WeakReference<>(retrofit);
    }
    return retrofitWeakReference.get();
}

刚刚说了WeakReference引用的对象会被回收, 而不是WeakReference对象本身会被回收, 即retrofitWeakReference.get() 会返回null. 所以应该判断

    if (retrofitWeakReference == null || retrofitWeakReference.get() == null) {
       ******
    }

实际上, 这里正常没必要用WeakReference, 因为希望这个实例是一直存在的(所以用单例). 这里不仅用了, WeakReference还用错了.

只要被weakreference引用的对象,方法结束后都会被垃圾回收期进行回收掉。但是对与一般的retrofit来说,你既然想单利长期持有,又想方法结束后回收,这样做是不是不好?
貌似明代你的意图了,是不是想做一些网络请求是的内存泄漏?可以结合application和baseActivity来做

如果对android技术比较感兴趣,可以关注一下微信公众号:终端研发部,和我一块交流和学习。

参考阅读:

技术文章集合—184篇文章分类汇总

为什么你那么努力,却一直还得不到提升?

终端研发部是一个以技术为主的学习交流技术号,谈的是技术,是产品,更是我们的人生。做东半球最会思考,最有味道的互联网开发者

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏