RxJava关于Android应用程序中的线程、CompositeDisposable和调度器的问题

RxJava关于Android应用程序中的线程、CompositeDisposable和调度器的问题,java,android,multithreading,rx-java,rx-java2,Java,Android,Multithreading,Rx Java,Rx Java2,我的代码如下: timingObservable = getCurrentModule() .zipWith(Observable.interval(200, TimeUnit.MILLISECONDS), (currentModule, interval) -> currentModule) .repeat() .distinctUntilChanged() .

我的代码如下:

timingObservable = getCurrentModule()
                .zipWith(Observable.interval(200, TimeUnit.MILLISECONDS), (currentModule, interval) -> currentModule)
                .repeat()
                .distinctUntilChanged()
                .getModuleDataFromDb()

compositeDisposable.add(timingObservable
        .subscribeOn(Schedulers.io())
        .subscribe(next -> {
            .
            .
            .
        }));

public Observable<String> getCurrentModule() {
    return Observable.fromCallable(() -> {
        String currentModule = "";
        // doing some none database work and computation
        .
        .
        .
        return currentModule;
    }
}
timingObservable=getCurrentModule()
.zipWith(可观察的时间间隔(200,时间单位。毫秒),(currentModule,interval)->currentModule)
.重复
.distinctUntilChanged()
.getModuleDataFromDb()
compositeDisposable.add(计时可观察
.subscribeOn(Schedulers.io())
.订阅(下一步->{
.
.
.
}));
公共可观测getCurrentModule(){
返回可观察。从可调用(()->{
字符串currentModule=“”;
//做一些非数据库工作和计算
.
.
.
回流模块;
}
}
它应该定期检查当前模块,如果模块发生更改,则从db获取一些数据。我有几个问题:

  • 在RxJava的RxThreadFactory类和newThread()方法中,我们有一行
    t.setDaemon(true)
    ,那么所有RxJava线程都是守护线程是真的吗?那么,只要应用程序的一个组件处于活动状态并且应用程序进程仍在运行,它们就处于活动状态,对吗

  • 我正在将subscribe()的一次性返回添加到我的服务/活动类的compositeDisposable中,并在onDestroy()中调用dispose。当服务在没有onDestroy()的情况下终止时,这些一次性返回会发生什么正在被调用。我的意思是,既然compositeDisposable对象已被销毁,我是否有可能失去处置一次性物品的能力?我是否应该持有compositeDisposable的应用程序范围实例

  • 就性能而言,此代码中建议使用哪一个?
    subscribeOn(Schedulers.io())
    subscribeOn(Schedulers.computation())
    ,因为Observable.interval默认使用计算调度器,我们也有数据库工作


  • 对于定期任务,是否有改进上述代码的建议


回答以下问题:

在RxJava的RxThreadFactory类和newThread()方法中,我们有一行t.setDaemon(true),那么所有RxJava线程都是守护线程是真的吗?那么,只要应用程序的一个组件处于活动状态且应用程序进程仍在运行,它们就处于活动状态,对吗

在Java
Thread::setDaemon(true)
中,这意味着一旦所有非守护进程线程都完成了,那么这些“守护进程”线程就会被放弃,JVM就会关闭线程不是守护进程线程,但有一个
活套
。守护进程线程可以自然完成,并且不会阻止进程退出。对于长时间运行的任务,您不应依赖此机制,而应使用前台服务和/或
WorkManager
,Rx线程池的持续时间可能与它们运行的进程相同,除非de>执行器与之关联的是显式关闭

我正在将subscribe()的一次性返回添加到我的服务/活动类的compositeDisposable中,并在onDestroy()中调用dispose。假设在一个场景中有一个服务和一个活动,compositeDisposable属于该服务。当服务在没有onDestroy()的情况下被终止时,这些可处置项会发生什么情况被调用,活动保持活动状态。我的意思是,既然compositeDisposable对象被破坏,我是否有可能失去处置可处置对象的能力?我是否应该保留compositeDisposable的应用程序范围实例

只有在以下情况下,服务才会在没有生命周期回调的情况下被销毁:1)Android停止进程以回收资源,在这种情况下,它与清除资源无关;2)程序崩溃,并且再次不需要清除资源

在性能方面,本规范中建议使用哪一种?subscribeOn(Schedulers.io())或subscribeOn(Schedulers.computation()),因为Observable.interval默认使用计算调度器,我们也有数据库工作

Schedulers.io
是一个无边界的线程池,而
Schedulers.computation()
是有边界的(我相信是8个线程池)。性能可能会有所不同,但在大多数情况下,差异可以忽略不计。一种情况是,如果连续使用此线程池有大量并发,则调度程序.computation()可能会变慢,这意味着您正在等待线程释放。相比之下,
Schedulers.io()
可能需要从它使用的
ThreadFactory
创建新线程的前期成本。但是,它将尝试使用其池中的现有线程。要真正看到个别用例的任何性能差异,都需要度量。根据一般规则,
io()
建议,对于文件/数据库/网络等工作,应使用此
调度程序
计算
类工作计时器/算法应使用后者


对于定期任务,是否有改进上述代码的建议


如前所述,轮询通常不是一个好主意,而概念上的反应流作为发布/订阅观察者模式更有用。但是,对于可以修改的内容,您似乎有一些限制。对于所提供的代码,实际给出任何具体改进的上下文太少,只有建议,最终将以“我不能这样做,因为…”结束。

“任何针对定期任务改进上述代码的建议”-如果您控制对DB上CRUD操作的访问,是否需要轮询任务,为什么不只是更新订阅服务器的数据库更改,或者使用Room Rx extensions为您处理这样的锅炉板呢?我通过纯计算得到一个数据,并根据该数据查询db表。数据库没有变化。与其试图解决轮询问题,我会尽量避免轮询。“我通过纯计算得到数据”-->这个计算依赖于某些东西,对吗?而这些东西会发生变化。每当它发生变化时,你都需要一个Su