基于Retrofit+RxJava2封装的一个Kotlin网络请求工具类

class RetrofitClient {
    companion object httpClient{
        val BASE_URL = "https://wanandroid.com/"
        private fun okHttpClient(headerMap: MutableMap<String, String> = mutableMapOf<String, String>()):OkHttpClient{
            var logLevel = HttpLoggingInterceptor.Level.BODY
            var logInterceptor = HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger{
                override fun log(message: String) {
                    Logging.log(message)
                }
            }).setLevel(logLevel)

            var builder = OkHttpClient.Builder()
            if (!headerMap.isNullOrEmpty()){
                builder.addInterceptor(object : Interceptor{
                    override fun intercept(chain: Interceptor.Chain): Response {
                        var request = chain.request().newBuilder()
                        for (item in headerMap){
                            request.addHeader(item.key, item.value)
                        }
                        return chain.proceed(request.build())
                    }
                })
            }

            builder.addInterceptor(logInterceptor)
            builder.callTimeout(30 * 1000, TimeUnit.MILLISECONDS)
            builder.connectTimeout(30 * 1000, TimeUnit.MILLISECONDS)
            builder.readTimeout(30 * 1000, TimeUnit.MILLISECONDS)
            builder .writeTimeout(30 * 1000, TimeUnit.MILLISECONDS)
            builder.build()
            var okHttpClient = builder.build()
            return okHttpClient
        }

        private fun getRetrofit(headerMap: MutableMap<String, String> = mutableMapOf<String, String>()) : Retrofit{
            var retrofit = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(okHttpClient(headerMap))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build()
            return retrofit
        }

        fun<T> getService(clazz: Class<T>, headerMap: MutableMap<String, String> = mutableMapOf<String, String>()): T{
            var retrofit = getRetrofit(headerMap)
            var tService = retrofit.create(clazz)
            return tService
        }

        /**
         * 因为Retrofit请求里面每个请求接口的API不一样,然后每个API对应的interface也就是
         * homeArticleList()方法
         * 对应的内容不一样,以目前还无法将RetrofitClient.getService()方法和RetrofitClient.requestData()方法融合成一个方法。
         * 但是共同点都是返回一个Observable对象,初步的设想方案是通过动态代理来实现。
         */
        fun <V> requestData(mObservable : Observable<V>, callBack: HttpCallBack):Disposable{
            return mObservable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(object : Consumer<V>, io.reactivex.functions.Consumer<V> {
                    override fun accept(t: V) {
                        callBack.success(t)

                    }

                }, object : Consumer<Throwable>, io.reactivex.functions.Consumer<Throwable> {
                    override fun accept(t: Throwable) {
                        Logging.log(t.localizedMessage)
                        callBack.failed(t)
                    }
                })
        }
    }


    interface HttpCallBack {
        fun <V> success(v:V)
        fun failed(t: Throwable)
    }
}

简单用法实例:

class ApiClient {
    interface HomePageAPI{
        @GET("article/list/{id}/json")
        fun homeArticleList(@Path("id") id :String): Observable<HomeArticleList>
    }
}

fun requestData(id: String = "0") {
    var mDisposable = RetrofitClient.requestData(
        RetrofitClient.getService(ApiClient.HomePageAPI::class.java).homeArticleList(id),
        object : RetrofitClient.HttpCallBack {
            override fun <V> success(v: V) {
                var list = (v as HomeArticleList)
                Logging.log("数据请求成功啦:$list.toString(),,${list.data?.datas?.get(0)}")
            }

            override fun failed(t: Throwable) {
                Logging.log("请求失败:${t.toString()}")
            }
    })
    logging("请求取消了吗?${mDisposable.isDisposed}")
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值