RxJava和POST / PUT请求服务器

时间:2017-05-02 15:41:15

标签: android rx-java rx-java2

我试图想出一个不错的方法,使用RxJava向我的服务器发送更新。使用RxJavaMVP架构可以轻松获取内容,但是,我在服务器上更新内容时遇到了一些麻烦。一个简单的例子是用户在他们的个人资料上改变了一些内容,我需要将其保存到服务器上。以前,我很可能会创建一个AsyncTask来处理对服务器的PUT请求,或者我会使用OkHttp回调功能。

在新的世界中,我考虑使用Service或者Singleton类来向用户发送此类更新。我们的想法是确保订阅不是UI生命周期的一部分。我已经定义了Service并在应用程序中处理了一些内容,因此将其扩展为发送用户配置文件更新等内容并不会太多工作。我有点挣扎的部分是我在哪里保留disposable以及何时取消订阅?

我真的没有任何代码要分享,但是我们说我有一个名为UserDispatcher的类,它提供了以下方法:

    public Observable<User> dispatchUserUpdate(@NonNull User user) {
        return mRepository
            .updateUserProfile(user)
            .subscribeOn(mSchedulerProvider.io())
            .observeOn(mSchedulerProvider.ui());
    }
目前,在UserDispatcher内创建了

Service。因此,Observable返回到Service并在Service中订阅(但这可能是错误的)。

1 个答案:

答案 0 :(得分:1)

退订

Reactive世界中的取消订阅不应与非Reactive世界中的取消订阅不同。因此,考虑应该与Service的生命周期相同,而不是Activity正如您所说,Service与UI无关,因此其生命周期非常简单(启动/停止)。
因此,您需要将订阅保留在服务中,即Observable发送的服务,并取消订阅onDestroy回调。

服务期限

关于服务的生命周期,取消订阅仅适用于您的Observable任务尚未完成且您不想泄漏资源的情况。但是,正常的路径是,您需要在Service完成后停止Observable 你应该在这里使用一个已启动的服务(不是绑定的服务),它将保持活着状态,直到你将其停止(或系统将其终止以声明资源),因此在你发送Observable之后它不会自行停止,你在更新Observable完成后,应该负责停止它。

推荐模式 - 预定作业

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

Job Scheduler lifspan

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