我试图想出一个不错的方法,使用RxJava
向我的服务器发送更新。使用RxJava
和MVP
架构可以轻松获取内容,但是,我在服务器上更新内容时遇到了一些麻烦。一个简单的例子是用户在他们的个人资料上改变了一些内容,我需要将其保存到服务器上。以前,我很可能会创建一个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
中订阅(但这可能是错误的)。
答案 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来完成实际的工作。)