我的代码如下:
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;
}
}
它应该定期检查当前模块,并在模块发生更改时从db获取一些数据。我有几个问题:
>
我正在向我的服务/活动类的onDestory()中的复合处置和调用处置添加订阅()的一次性返回。当服务在没有调用onDestroy()的情况下被杀死时,这些一次性对象会发生什么。我的意思是,由于复合处置对象已被销毁,我是否可能失去处置一次性对象的能力?我应该持有CompositeDisposable的应用程序范围实例吗?
就性能而言,这段代码推荐哪一个?订阅(Schedulers.io())
或订阅(Schedulers.computation())
因为Observable.interval默认使用计算调度程序,我们也有数据库工作。
有什么建议可以改进上述周期性任务的代码吗?
回答以下问题:
在RxJava的RxThreadFactory类和newThread()方法中,我们有t.setDaemon(true)行,那么所有RxJava线程都是守护线程是真的吗?所以,只要应用程序的一个组件是活动的并且应用程序进程仍在运行,它们就是活动的,对吗?
在JavaThread::setDaemon(true)
只是意味着一旦所有非守护线程都完成,那么这些“守护”线程就会被放弃并关闭JVM。作为参考,android“main”Thread不是守护线程,但有一个Looper
。守护线程可以自然完成并且不会阻止进程退出。您不应该依赖这种机制来执行长时间运行的任务,并且使用前台服务和/或WorkManager
,Rx线程池可以持续与其运行的进程一样长的时间,除非它们绑定的执行器
显式关闭。
我正在将subscribe()的一次性返回添加到服务/活动类的compositeDisposable中,并在onDestory()中调用dispose。假设在一个场景中有一个服务和一个活动,compositeDisposable属于该服务。当服务在没有调用onDestroy()的情况下被终止,并且活动保持活动状态时,这些可处置项会发生什么情况。我的意思是,既然compositeDisposable对象被破坏了,我是否有可能失去处理一次性物品的能力?我是否应该保留CompositeDisposable的应用程序范围实例?
只有在以下情况下,服务才会在没有生命周期回调的情况下被销毁:1)Android终止进程以回收资源,在这种情况下,它与清除资源无关;2)程序崩溃,并且再次不需要清理资源
在性能方面,本规范建议采用哪种性能?subscribeOn(Schedulers.io())或subscribeOn(Schedulers.computation())自可观察。interval默认使用计算调度器,我们也有DB工作。
Schedulers.io
是一个无界的线程池,而Schedulers.computation()
是有界的(我相信是8个线程的池)。性能可能会有所不同,但在大多数情况下差异可以忽略不计。一种情况下,Schedulers.computation()
可能会变慢,如果您连续使用此线程池有很多并发,这意味着您正在等待线程空闲。相比之下,Schedulers.io()
可能需要从它使用的ThreadFactory
创建新线程的前期成本。但是它会尝试使用其池中的现有线程。需要指标才能真正看到单个用例的任何性能差异。根据一般规则io()
建议,对于文件/数据库/网络等工作,应使用此Scheduler
和计算
工作,就像计时器/算法应该使用后者。
有什么建议可以改进上述周期性任务的代码吗?
如前所述,轮询通常不是一个好主意,而概念上的反应流作为发布/订阅观察者模式更有用。然而,您似乎对可以修改的内容有一些限制。有了提供的代码,真正给出任何具体改进的上下文太少,只有建议,最终会以“我不能那样做,因为…”结束。
我想知道有没有可能实现优先级查询来解决以下问题:假设有一所学校由于疫情需要调整其最大在校生数。比如某天有4节课,分别是9:00-11:00 50人,10:00-12:00 25人,14:00-16:00 60人,17:00-18:00 70人。那么当前最大的学生是75人,因为当它是10:00-11:00的时候,总共有75个学生在上课。我最初的想法是创建两个优先级队列,一个以课程开始时间为优先级,另
主要内容:RxJava Observable CompositeDisposable类 介绍,RxJava Observable CompositeDisposable类 声明,RxJava Observable CompositeDisposable类 协议,RxJava Observable CompositeDisposable类 示例RxJava Observable CompositeDisposable类 介绍 CompositeDisposable 类表示一个容器,它可以容纳多个一
我是Android的新手,我对服务和线程的生命周期感到很困惑。 假设我有一个活动,它通过调用startService()在工作线程中启动服务。根据谷歌文档,即使调用组件被破坏,该服务也将无限期运行。 所以我的问题是:如果应用程序进程被完全销毁(退出并从后台堆栈中清理),服务是否仍在运行?UI线程是否仍在运行?如果是,这是否意味着即使其调用进程被破坏,线程也不一定会被终止?
问题内容: 我在维护的Swing应用程序中遇到了僵局,尽管我有一个可行的解决方法,但我不确定我是否了解自己在做什么,还没有隐藏可能弹出的竞争条件稍后再试。 线程跟踪显示死锁发生在两个线程AWT-EventQueue-0和AWT- EventQueue-1之间。我的第一个问题是,如果其中一个是臭名昭著的事件调度线程。这两个线程在堆栈跟踪的底部都有以下内容: 我认为问题的根源在于应用程序类将域数据与图
在我开发一个小型android应用程序的过程中,我遇到了一个问题,即使应用程序被用户终止,也无法运行警报管理器。当应用程序在前台或后台运行时,一切都很好。 我已经完成了follwing步骤: AndroidManifest.xml MainActivity.java在一个按钮的OnClick方法中,我称之为 x是类范围的vsisible变量 `public void startAlert(long
我知道这个问题已经被问过很多次了。但是有些事情我从来没有找到答案。所以希望有人能给我一些启发。 我们都知道,AsyncTask和Thread是执行后台任务以避免ANR问题的选项。建议asynctask只能用于短期运行的任务,而线程可以用于长期运行的任务。asynctask不应用于长任务的原因是众所周知的,这与asynctask可能导致的泄漏有关,因为它可能在活动销毁后继续运行。这很有说服力。然而,