您好我正在尝试学习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
)
答案 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)