notas Andrews - Ideas Network paquete de marco (retrofit + rxjava)

  Andrews marco de la red como marco para el desarrollo de los más utilizados, como lo he estado pensando acerca de cómo perezosos para utilizar el código más corto para las solicitudes de red completas, los billetes de papel que como él mismo.

premisa

  Estoy usando una modificación marco de la red, Andrews desarrollado como uno de los marcos web más popular, no me presenté, puede tener amigos no entienden sus propias Baidu, que proporciona alrededor de adaptación a la dirección de GitHub: Haga clic aquí , los datos JSON análisis del uso es la dirección Gson, GitHub: haga clic aquí , y adopto retrofit + rxjava manera de lograr las solicitudes de red, esto también proporciona rxjava de dirección de GitHub: haga clic aquí para  allí rxAndroid de dirección de GitHub: haga clic aquí

empezar

  En primer lugar, al paquete de modernización para crear una instancia de, aparte de otras cosas, el primer Código directa

/**
 *@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()
    }

  Utilice el patrón Singleton para asegurar global sólo creará una vez, pero debido a que el proyecto necesita se puede producir el cambio de la demanda baseurl, por lo que un método para volver a crear la instancia de adaptación.

  Es operado de nuevo cuando la solicitud de simplificación, sólo el primer vistazo al caso de la adaptación de la red una petición, de la siguiente manera:

 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>>) {
                //成功情况
            }

        })

Sin embargo, en la red de desarrollo real puede necesitar solicitar una interrupción, o un caso en el que una pluralidad de solicitudes secuenciales se puede utilizar para readaptar + rxjava escrito, como sigue:

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

            })

Esta realización puede ser utilizada para gestionar la solicitud desechable de red, y la solicitud puede ser implementado cadena, sin embargo, porque perezoso, por lo que quería esta sección para hacer un paquete, como sigue:

/**
     * 仅针对与单次网络请求的封装,若在链式多次请求场景下,则还需要自行拼接链式请求
     */
    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)
                }

            })
    }

El primer parámetro es apiservice, el segundo parámetro es una devolución de llamada cuando la solicitud tuvo éxito. (Agradable Kotlin con) la forma en que puse mi propia definición de baseViewModel porque mis solicitudes de red se escriben en el modelo de vista interior. Estos son el marco de la red paquete de ideas que.

Publicado seis artículos originales · ganado elogios 0 · Vistas 83

Supongo que te gusta

Origin blog.csdn.net/u011997929/article/details/105065580
Recomendado
Clasificación