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();
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
只要被weakreference引用的对象,方法结束后都会被垃圾回收期进行回收掉。但是对与一般的retrofit来说,你既然想单利长期持有,又想方法结束后回收,这样做是不是不好?
貌似明代你的意图了,是不是想做一些网络请求是的内存泄漏?可以结合application和baseActivity来做
如果对android技术比较感兴趣,可以关注一下微信公众号:终端研发部,和我一块交流和学习。
参考阅读:
技术文章集合—184篇文章分类汇总
为什么你那么努力,却一直还得不到提升?
终端研发部是一个以技术为主的学习交流技术号,谈的是技术,是产品,更是我们的人生。做东半球最会思考,最有味道的互联网开发者
用单例又用弱引用,自相矛盾啊,你应该再学学什么是单例,为什么用单例
简单讲, 就是一个对象只有一个弱引用的指向时, 它是可以被回收的.
2.retrofit是够需要使用单例 将retrofit放入weakreference中.
可以, 但没必要. 另外代码的非空判断也有问题, 没有判断对象是否被回收了.
刚刚说了WeakReference引用的对象会被回收, 而不是WeakReference对象本身会被回收, 即retrofitWeakReference.get() 会返回null. 所以应该判断
实际上, 这里正常没必要用WeakReference, 因为希望这个实例是一直存在的(所以用单例). 这里不仅用了, WeakReference还用错了.
会回收,和是否单例无关,只要对象没被其它人引用就会回收。
看你是什么情况要用到weakref,一般情况下保存一个强引用的单例就可以了,一个app下不会有很多个这样的单例