网络框架作为安卓开发中最常用的框架,作为懒人的我一直在思考怎样才能用最短的代码来完成网络请求,本文在于作为本人备忘使用。
前提
我使用的网络框架是retrofit,作为目前安卓开发最流行的网络框架之一,我就不介绍了,有不了解的朋友可以自行百度,在这就提供一下retrofit的GitHub地址:点击这里,json数据解析使用的是Gson,GitHub地址:点击这里,另外我采用retrofit+rxjava的方式来实现网络请求,在此也提供rxjava的GitHub地址:点击这里 还有rxAndroid的GitHub地址:点击这里
开始
首先先封装retrofit的创建实例,二话不说,直接先上代码
/**
*@author Chord.p
*@time 2019-12-31 16:03
*speak softly love
*
* 网络框架封装
*/
class RetrofitFactory private constructor(){
var retrofit : Retrofit
var gson : Gson = Gson().apply { this.serializeNulls() }
companion object {
//单例模式,懒加载
private val instance : RetrofitFactory by lazy { RetrofitFactory() }
fun <T> createRequest(clazz : Class<T>) : T { return instance.retrofit.create(clazz) }
fun buildRetrofit(baseUrl : String) {
var client = OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
// .addInterceptor(object : Interceptor{
// override fun intercept(chain: Interceptor.Chain): Response {
// Log.e("header","${chain.request().headers}")
// return chain.proceed(chain.request())
// }
//
// })
.build()
instance.retrofit = Retrofit.Builder()
.baseUrl("BASEURL")
.addConverterFactory(GsonConverterFactory.create(instance.gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build()
}
fun getGson() : Gson {
return instance.gson
}
}
init {
var client = OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.build()
retrofit = Retrofit.Builder()
.baseUrl("BASEURL")
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build()
}
使用了单例模式来保证全局只会创建一次,但是由于项目需求可能会出现变更baseurl的需求,所以提供一个方法重新创建retrofit实例。
再来就是简化请求时的操作了,先来看仅用retrofit进行网络请求的情况,代码如下:
val retrofit = Retrofit.Builder().baseUrl("www.chord.com/").build()
var request = retrofit.create(APIService::class.java)
var call = request.request()
call.enqueue(object : Callback<BaseData<Any>> {
override fun onFailure(call: Call<BaseData<Any>>, t: Throwable) {
//失败情况
}
override fun onResponse(call: Call<BaseData<Any>>, response: Response<BaseData<Any>>) {
//成功情况
}
})
但是在实际开发中网络请求可能需要中断,或者多个请求顺序进行的情况,所以可以使用retrofit+rxjava的写法,代码如下:
val retrofit = Retrofit.Builder().baseUrl("www.chord.com/").build()
var request = retrofit.create(APIService::class.java)
request.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<BaseData<ArrayList<DishSortData>>> {
override fun onComplete() {
}
override fun onSubscribe(d: Disposable) {
}
override fun onNext(t: BaseData<ArrayList<DishSortData>>) {
}
override fun onError(e: Throwable) {
}
})
这种方式可以利用disposable来管理网络请求,并且可以实现链式请求,然而由于我很懒,所以想把这一段做一个封装,代码如下:
/**
* 仅针对与单次网络请求的封装,若在链式多次请求场景下,则还需要自行拼接链式请求
*/
inline fun <T> request(observable : Observable<T> , crossinline callBack : (T) -> Unit) {
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<T> {
override fun onComplete() {
}
override fun onSubscribe(d: Disposable) {
}
override fun onNext(t: T) {
callBack.invoke(t)
}
override fun onError(e: Throwable) {
Log.e("netError",e.message)
}
})
}
第一个参数是apiservice,第二个参数是请求成功时的回调。(kotlin真好用 )这个方法我放在我自己定义的baseViewModel中,因为我的网络请求都是写在viewModel里的。以上就是我封装网络框架的思路。