上下文:我当前的应用程序使用常规的retrofit calls
来从api
获取数据。我真的很想在通话中介绍RX
,但是我对此没有太多经验。我在网上阅读了一些内容,但没有一个显示出执行此操作的简单方法。我会告诉你我所拥有的。
目的:将我拥有的东西变成RXJava
这是我的代码:
我要转换为RXJava
的通用执行调用方法:
fun <T> performCall(call: Call<T>?, callback: OnRequestCallback<T>) {
call?.enqueue(object : Callback<T> {
override fun onResponse(call: Call<T>, response: Response<T>) {
when (response.code()) {
200, 201 -> {
callback.onSuccess(response.body())
}
else -> {
callback.onError(response.errorBody())
}
}
return
}
override fun onFailure(call: Call<T>, t: Throwable) {
callback.onError(null)
Log.d("Network Manager Failure", t.localizedMessage)
}
})
}
然后从我的活动中获取上下文,我使用此方法调用perform调用方法:
fun <T> BaseActivity.callAPI(call: Observable<T>?, onSucceed: (T?) -> Unit, onError: (errorCode: String) -> Unit) {
NetworkManager.instance.performCall(call,
object : NetworkManager.OnRequestCallback<T> {
override fun onSuccess(body: T?) {
onSucceed(body)
}
override fun onError(errorResponseBody: ResponseBody?) {
JSONObject(errorResponseBody?.string()).let {
val errorCode = it.getJSONObject("meta").getString("errorCode")
when (errorCode) {
Errors.DEPRECATED_API_VERSION.name ->
onAppUpdateNeeded()
else -> onError(errorResponseBody)
}
}
}
})
}
然后BaseActivitt.callApi()
会在需要api信息的每个活动中使用,我现在使用view models
+ dagger
更好,但现在是我拥有的,我必须保持它。
有人可以告诉我如何将其变成RXJava/Kotlin
吗?
答案 0 :(得分:0)
说实话,我不喜欢拥有这些通用处理程序的想法。我不得不从事一个像这样编写的项目,但这并不是一个很好的体验:例如,如果您想以不同的方式处理Errors.DEPRECATED_API_VERSION
来进行通话,会发生什么?
无论如何,我会做类似的事情:从Retrofit中返回Observable,然后在需要使呼叫订阅Observable的地方。
val disposable = service
.yourApi()
.map { value ->
MyCommand.SuccessCommand(value)
}
.onErrorResumeNext { ex: Throwable -> YourObservableThatEmitsTheErrorCommandOrTheOnAppUpdateNeededCommand() }
.subscribe { command: MyCommand ->
when (command) {
is MyCommand.SuccessCommand -> {
}
is MyCommand.ErrorCommand -> {
}
is MyCommand.AppUpdateNeededCommand -> {
}
}
}
该命令可以像
一样实现。sealed class MyCommand {
class SuccessCommand<T> (value: T): MyCommand()
class ErrorCommand (val ex: Exception): MyCommand()
object AppUpdateNeededCommand: MyCommand()
}