安卓笔记-网络框架封装思路(retrofit+rxjava)

  网络框架作为安卓开发中最常用的框架,作为懒人的我一直在思考怎样才能用最短的代码来完成网络请求,本文在于作为本人备忘使用。

前提

  我使用的网络框架是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里的。以上就是我封装网络框架的思路。

你可能感兴趣的:(android,kotlin)