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}")
}