如何在正常的改造调用中使用RxJava?

时间:2019-03-16 16:04:25

标签: android retrofit2 rx-java2

上下文:我当前的应用程序使用常规的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吗?

1 个答案:

答案 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()
}