Android-Rxjava&retrofit&daggerAndroid开发经验谈Android开发

Retrofit + RxJava2 + MVP ?

2018-05-05  本文已影响270人  WangJie0822
image.png

前言


添加依赖


dependencies{
    /* OkHttp + Retrofit */
    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    // RxJava2
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    /* RxJava2 + RxAndroid */
    implementation 'io.reactivex.rxjava2:rxjava:2.1.12'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
}

对比
RxJava

compile'com.squareup.retrofit2:adapter-rxjava:2.0.2' // 用于Retrofit支持RxJava
compile'io.reactivex:rxjava:1.1.0' // RxJava
compile'io.reactivex:rxandroid:1.1.0' // RxAndroid

RxJava2

implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' // 用于 Retrofit 支持 RxJava2
implementation 'io.reactivex.rxjava2:rxjava:2.1.12' // RxJava2
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' // RxAndroid2

Retrofit初始化


    // Kotlin 代码,Java 中使用没有区别
    fun getRxApi(): RxApi {
        // 初始化 OkHttpClient
        val okHttpClient = OkHttpClient.Builder()
                // 设置超时时间
                .connectTimeout(NET_CONNECT_TIME_OUT, TimeUnit.SECONDS)
                .writeTimeout(NET_WRITE_TIME_OUT, TimeUnit.SECONDS)
                .readTimeout(NET_READ_TIME_OUT, TimeUnit.SECONDS)
                // 设置参数拦截器,添加公共参数
                .addInterceptor(ParamsInterceptor(
                        mapOf("version" to BuildConfig.VERSION_NAME,
                                "app" to "android"),
                        BuildConfig.DEBUG))
                // 日志拦截器,打印日志
                .addInterceptor(LogInterceptor(
                        if (BuildConfig.DEBUG) Level.BODY else Level.NONE,
                        object : InterceptorLogger {
                            override fun log(msg: String) {
                                Logger.d(msg)
                            }
                        }))
                .build()
        // 初始化 Retrofit
        val retrofit = Retrofit.Builder()
                // 服务器根路径
                .baseUrl(UrlDefinition.BASE_URL)
                // 添加 RxJava2 支持,就这里与 RxJava 区别
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                // 添加 Gson 解析
                .addConverterFactory(GsonConverterFactory.create())
                .client(okHttpClient)
                .build()
        return retrofit.create(RxApi::class.java)
    }
// Kotlin
interface RxApi {
    /**
     * 请求接口
     **/
    @GET("url")
    fun getData(@Query("param") param: String): Observable<DataEntity>
}

// Java
public interface RxApi {
    /**
     * 请求接口
     **/
    @GET("url")
    Observable<DataEntity> getData(@Query("param") String param);
}

使用


        getRxApi()
                .getData(param) // 定义在RxApi中的接口方法
                .subscribeOn(Schedulers.io()) // RxJava2方法,控制请求执行的线程
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<DataEntity>() { // 请求成功回调
                    @Override
                    public void accept(DataEntityweatherBean) throws Exception {
                        onSuccess(weatherBean);
                    }
            }, new Consumer<Throwable>() { // 请求失败回调
                @Override
                public void accept(Throwable throwable) throws Exception {
                    onFail(throwble);
                }
            });

RxJava2 生命周期管理


// Kotlin
open class BaseMvpPresenter<V : BaseMVPView, M : BaseMVPModule> {

    /** RxJava2 生命周期管理  */
    private val disposables = CompositeDisposable()

    ...
    /**
     * 将网络请求添加到 RxJava2 生命周期
     */
    protected fun addDisposable(dis: Disposable) {
        disposables.add(dis)
    }

    /**
     * 消费所有事件
     */
    fun dispose() {
        disposables.clear()
    }
    ...
}
        Disposable disposable = getRxApi()
                .getData(param) // 定义在RxApi中的接口方法
                .subscribeOn(Schedulers.io()) // RxJava2方法,控制请求执行的线程
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<DataEntity>() { // 请求成功回调
                    @Override
                    public void accept(DataEntityweatherBean) throws Exception {
                        onSuccess(weatherBean);
                    }
            }, new Consumer<Throwable>() { // 请求失败回调
                @Override
                public void accept(Throwable throwable) throws Exception {
                    onFail(throwble);
                }
            });
        addDisposable(disposable);
Activity or Fragment {
    @Override
    public void onDestory() {
        super.onDestory()
        mPresenter.dispose()
    }
}


上一篇 下一篇

猜你喜欢

热点阅读