如何在android中使用rxjava2改造

时间:2017-10-23 14:39:12

标签: android kotlin retrofit2 rx-java2

您好我正在尝试学习rxjava2。我试图使用rxjava2调用API,并使用retrofit构建URL并将JSON转换为Moshi。

我想将Observable模式与retrofit一起使用。有谁知道这样做的方法是什么?任何标准和最佳方法,如错误处理包装器和所有?

AppModule.kt

@Provides
@Singleton
fun provideRetrofit(moshi: Moshi, okHttpClient: OkHttpClient): Retrofit {
    return Retrofit.Builder()
            .addConverterFactory(MoshiConverterFactory.create(moshi))
            .baseUrl(BuildConfig.BASE_URL)
            .client(okHttpClient)
            .build()
}

ApiHelperImpl.kt

@Inject
lateinit var retrofit: Retrofit

override fun doServerLoginApiCall(email: String, password: String): Observable<LoginResponse> {
    retrofit.create(RestApi::class.java).login(email, password)
}

我从下面的doServerLoginApiCall致电LoginViewModel

LoginViewModel.kt

fun login(view: View) {
    if (isEmailAndPasswordValid(email, password)) {
        ApiHelperImpl().doServerLoginApiCall(email, password)
    }
}

RestApi.kt

interface RestApi {

    @FormUrlEncoded
    @POST("/partner_login")
    fun login(@Field("email") email: String, @Field("password") password: String): Call<LoginResponse>
}

LoginResponse.kt

data class LoginResponse(

        @Json(name = "code")
        val code: Int? = null,

        @Json(name = "otp_verify")
        val otpVerify: Int? = null,

        @Json(name = "data")
        val userDetails: UserDetails? = null,

        @Json(name = "message")
        val message: String? = null,

        @Json(name = "status")
        val status: String? = null
)

3 个答案:

答案 0 :(得分:4)

这是向您展示如何将Retrofit2与RxJava2一起使用的粗略想法。你可以在谷歌找到很多教程。

第1步: 将以下依赖项添加到gradle文件

// Rx stuff
compile "io.reactivex.rxjava2:rxjava:$rxJavaVersion"
compile "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion"

// retrofit
compile "com.squareup.retrofit2:retrofit:$retrofitVersion"
compile "com.squareup.retrofit2:adapter-rxjava2:$retrofitVersion"
compile "com.squareup.retrofit2:converter-moshi:$retrofitVersion"

步骤2:像你一样创建你的Retrofit API接口,但它有一点区别,那就是返回类型应该是Observable<LoginResponse>而不是Call<LoginResponse>

interface RestApi {

    @FormUrlEncoded
    @POST("/partner_login")
    fun login(@Field("email") email: String, @Field("password") password: String): Observable<LoginResponse>
}

第3步: 为您构建改造API对象:

retrofit.create(RestApi::class.java).login(email, password)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe{ loginResponse ->
             // TODO deal with your response here
 }

答案 1 :(得分:1)

难道你不知道如何返回结果吗?

使用rx返回结果的方法如下。

ApiHelperImpl().doServerLoginApiCall(email, password)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe { result ->
                    // doSomething
                }

subscribeOn在另一个帖子中调用api observeOn是在主线程中处理subscribe的过程 subscribe有多种重载方法。请查看document

答案 2 :(得分:0)