请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Java我在创建Retrofit包括OkhttpClient的时候使用的内部类Holder加载模式,一惰性加载,二保证线程安全,Kotlin老师看看对不对


https://img1.sycdn.imooc.com//szimg/5d40063d0810c6c711520864.jpg

object RetrofitCreator{
    val BASE_URL = Github.getConfiguration(ConfigKeys.API_HOST) as String

    val RETROFIT_CLIENT = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .client(OKCLIENT.CLIENT)
            .build()
}

object OKCLIENT{
   const val TIME_OUT:Long =60;
    val BUILDER by lazy {
        OkHttpClient.Builder()
    }
    fun getBuilder():OkHttpClient.Builder {
        Github.getConfiguration<ArrayList<Interceptor>>(ConfigKeys.INTERCEPTOR).map{
                BUILDER.addInterceptor(it)
        }
        return BUILDER
    }
    val CLIENT = getBuilder()
                .connectTimeout(TIME_OUT, TimeUnit.SECONDS)
                .readTimeout(TIME_OUT,TimeUnit.SECONDS)
                .cache(Cache(cacheFile,1024*1024*1024))
                .build()

}

正在回答 回答被采纳积分+3

2回答

提问者 qq_lee_3 2019-07-31 17:02:55

我这个getBuilder无论几次网络请求,只调用了一次,它只是为了加载各种拦截器进去的,返回的还是声明过的BUILDER
生成的OkhttpClient也只需要一次就好了,没必要每次都去实例化一个出来
最终这个Retrofit也是单例的,因为那些配置都一样,只不过通过create(service)生成的call<Object>不同,项目里是Observable<Object>

经测试,感觉没有什么问题啊
因为我是按照Java的思路去改的,Kotlin还是不太了解有哪儿不妥

0 回复 有任何疑惑可以回复我~
  • 其实我感觉你的Builder和getBuilder有点儿多余,既然就调用一次,为什么不跟client的定义放一起呢?
    
    这样写相当于builder对象一直存在不会释放,同时getBuilder如果重复调用的话,这个Builder会被重复添加拦截器呀,你说是不是这样?
    回复 有任何疑惑可以回复我~ 2019-07-31 17:08:32
  • 提问者 qq_lee_3 回复 bennyhuo #2
    我主要是把那些Interceptor都在App加了一个统一的配置入口,这样加拦截器的时候不用每次都回到网络这里一个一个添加,然后在这里拿到的是一个List<Interceptor>,做了一个map或者foreach将这个Interceptor都加入Builder里,如果不搞出来这个变量,好像没法操作了,它也没有一个addInterceptors方法,写个扩展方法?
    回复 有任何疑惑可以回复我~ 2019-07-31 17:17:09
  • 提问者 qq_lee_3 回复 bennyhuo #3
    写了一个addInterceptors扩展方法,谢谢老师指出问题
    Kotlin扩展方法太方便了
    回复 有任何疑惑可以回复我~ 2019-07-31 17:24:41
bennyhuo 2019-07-30 19:06:26

一般没必要共享builder的实例的。

单纯看你的代码,你想想你的getBuilder多次调用会发生什么?

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信