创建反应式 JobService

Gri*_*u47 5 android reactive-programming rx-java android-jobscheduler

我正在使用JobServiceFirebase JobDispatcher (与常规非常相似JobService)创建一个在后台运行并检查服务器上的数据是否已更改(我无法使用推送通知,因为我不拥有该服务器)。

我想知道是否JobService可以在主题的帮助下做出反应:基本上,我将一个单例数据存储库注入到启动 的应用程序类中JobService,该类又通过可以在应用程序中订阅的主题发出新数据班级:

@Inject class DataRepo {
     internal val subject = PublishSubject.create<Data>()

     // the service should only be started when there are actually subscribers observing the subject
     val latestData: Observable<Data> = subject
             .doOnSubscribe { jobDispatcher.create(job) }
             .doOnDispose { jobDispatcher.cancel(job.tag) }
             .share()

     val job = JobDispatcher.newJobBuilder()......build()
}

class LoadDataService : JobService() {
    @Inject
    protected lateinit var dataRepo: DataRepo

    private var networkRequest: Disposable? = null

    override fun onCreate() {
        super.onCreate()
        component.inject(this)
    }

    override fun onStartJob(jobParams: JobParameters): Boolean {
        networkRequest = dataRepo.getNewestData()
                .subscribe({ newData ->
                    dataRepo.subject.onNext(newData)
                    jobFinished(jobParams, false)
                }, { error ->
                    jobFinished(jobParams, true)
                })

        // job hasn't finished yet. Work is still going on in the background
        return true
    }

    override fun onStopJob(params: JobParameters?): Boolean {
        networkRequest?.dispose()
        // job was cancelled before jobFinished could be called.
        // The job should be retried if possible
        return true
    }
}

class App {
    @Inject val dataRepo: DataRepo

    override fun onCreate() {
        dataRepo.latestData.subscribe(this::sendNotification)
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,首先,我的发射永远不会到达类中的订阅者App,其次,不能保证设备将唤醒足够长的时间以使所有订阅者完成其工作,因为系统可能会在JobService已打来电话jobFinished()