如何在 Android 中使用 RxJava 进行 gey body() 响应



我是 Kotlin 的新手,我正在制作一种方法来调用端点接口并使用那里存在的方法之一。我正在使用Observable<>而不是Call<>响应。我想知道如何在上面的"结果"中获取响应正文((。这是我的方法

private fun refreshUser(userLogin: String) {
executor.execute {
// Check if user was fetched recently
val userExists = userDao.hasUser(userLogin, getMaxRefreshTime(Date())) != null
// If user have to be updated
if (!userExists) {
disposable = endpoints.getUser(userLogin)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ result -> /*Get the response body() HERE*/},
{ error -> Log.e("ERROR", error.message) }
)
}
}
}

这完全取决于您如何定义Retrofit接口。为了获得Response您需要从界面返回如下所示的内容:

fun getUsers() : Observable<Response<User>>

然后在{ result -> /*Get the response body() HERE*/}里面,你会得到一些形式Response<User>的东西,它有响应的主体。

另外需要注意的是,如果您利用Room进行dao交互,则不需要附上executor;它支持 RxJava。可以使用 RxJava 运算符将dao查找与服务器调用相结合。

请参阅本教程

https://medium.freecodecamp.org/rxandroid-and-kotlin-part-1-f0382dc26ed8

//Kotlin
Observable.just("Hello World")
.subscribeOn(Schedulers.newThread()) 
//each subscription is going to be on a new thread.
.observeOn(AndroidSchedulers.mainThread())) 
//observation on the main thread
//Now our subscriber!
.subscribe(object:Subscriber<String>(){
override fun onCompleted() {
//Completed
}
override fun onError(e: Throwable?) {
//TODO : Handle error here
}
override fun onNext(t: String?) {
Log.e("Output",t);
}
})

如果要使用 Retrofit 2 和 RxJava 2

https://medium.com/@elye.project/kotlin-and-retrofit-2-tutorial-with-working-codes-333a4422a890

interface WikiApiService {
@GET("api.php")
fun hitCountCheck(@Query("action") action: String,
@Query("format") format: String,
@Query("list") list: String,
@Query("srsearch") srsearch: String): 
Observable<Model.Result>
}

可观察的是类响应。

private fun beginSearch(srsearch: String) {
disposable = 
wikiApiServe.hitCountCheck("query", "json", "search", srsearch)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ result -> showResult(result.query.searchinfo.totalhits) },
{ error -> showError(error.message) }
)
}

如果,正如你对@Emmanuel提到的,你的getUser()方法的返回类型是Observable<Response<User>>那么调用result.body()将产生结果User

{ result ->
val user: User = result.body()
}

但是,如果您正在寻找原始响应,则可以改为调用result.raw().body(); 这将返回一个okhttp3.ResponseBody类型。

{ result ->
val body: ResponseBody = result.raw().body()
val text: String = body.string()
}

最新更新