【问题标题】:How to use rxjava2 with retrofit in android如何在 android 中使用 rxjava2 进行改造
【发布时间】:2017-10-23 14:39:12
【问题描述】:

您好,我正在尝试学习 rxjava2。我正在尝试使用 rxjava2 调用 API,并使用改造来构建 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)
}

我正在从LoginViewModel 拨打doServerLoginApiCall,如下所示

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
)

【问题讨论】:

标签: android kotlin retrofit2 rx-java2


【解决方案1】:

这是向您展示如何将 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&lt;LoginResponse&gt; 而不是 Call&lt;LoginResponse&gt;

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
 }

【讨论】:

【解决方案2】:

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

用rx返回结果的方式如下。

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

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

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多