RxJava 和 POST/PUT 请求到服务器

RxJava and POST/PUT requests to the server

我正在尝试想出一种使用 RxJava 向我的服务器发送更新的合适方法。使用 RxJavaMVP 架构很容易获得东西,但是,我在更新服务器上的东西时遇到了一些困难。一个简单的例子是 'user changed something on their profile and I need to persist it to the server'。以前,我很可能会创建一个 AsyncTask 来处理对服务器的 PUT 请求,或者我会使用 OkHttp 回调功能。

在新世界中,我正在考虑使用 Service 或者 Singleton class 向用户发送此类更新。这个想法是为了确保订阅不是 UI 生命周期的一部分。我已经定义了 Service 并处理了应用程序中的一些内容,因此扩展它以发送诸如用户个人资料更新之类的内容不会有太多工作。我有点挣扎的部分是我应该把我的 disposable 放在哪里,我什么时候退订?

我真的没有任何代码可以分享,但假设我有一个名为 UserDispatcher 的 class,它提供了以下方法:

    public Observable<User> dispatchUserUpdate(@NonNull User user) {
        return mRepository
            .updateUserProfile(user)
            .subscribeOn(mSchedulerProvider.io())
            .observeOn(mSchedulerProvider.ui());
    }

UserDispatcher 目前是在我的 Service 中创建的。因此 Observable 返回到 Service 并在 Service 中订阅(但这可能是错误的)。

退订

反应世界中的取消订阅与非反应世界中的取消订阅应该没有什么不同。所以考虑因素应该是相同的,即 Service 的生命周期,而不是你所说的 ActivityService 与 UI 无关,因此它的生命周期很简单 (started/stopped).
因此,您需要在服务中保留您的订阅,即发送 Observable 的服务,并在 onDestroy 回调中取消订阅。

使用寿命

关于服务的生命周期,退订仅适用于您的Observable任务尚未完成且您不想泄漏资源的情况。但是,正常的路径是,您需要在 Observable 完成后停止 Service
你应该在这里使用一个启动的服务(不是绑定的服务),它会一直存在直到你停止它(或者系统杀死它以索取资源),所以它不会在你发送 Observable 后自行停止,你应该负责在更新 Observable 完成后停止它。

推荐模式 - 预定作业

一般来说,不推荐使用 Singleton,因为它不是 Android 系统组件,因此 Android 无法像 Service 那样对其进行控制。诸如在工作尚未完成时重新安排、在系统即将终止 Service 等时收到通知等...
至于 Service,也不再推荐 Lollipop 及以上,因为我们现在有 JobScheduler APIs,因为系统对后台处理(或其他 API 也支持较旧的 Android 版本,例如 Firebase JobDispatcher)。
但这应该没有太大区别,例如,在 JobScheduler API 中,您有应该取消订阅的 onStopJob 事件。

Job Scheduler lifspan

关于 JobScheduler 的生命周期,它具有相同的模式,当 Observable 任务完成时,您应该调用 jobFinished() 向系统发出您的工作已完成的信号(JobScheduler 使用服务来完成实际工作)。