我是 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()
}