gpt4 book ai didi

android - RxJava (Android) - 让调度程序保持 Activity 状态有什么坏处吗?

转载 作者:搜寻专家 更新时间:2023-11-01 08:30:28 24 4
gpt4 key购买 nike

我有一个包含对我的数据库对象的引用的单例。我想做的是将任何数据库操作限制为单个 IO 线程。

首先我尝试了以下方法:

class SQLSingleton{

...

public Observable<MyObject> query(final String id){

return Observable.fromCallable(() -> {

//database operations here
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}

...
}

这种方法的问题是 Schedulers.io() 可能会为每个订阅我上面的 observable 的订阅者从它的池中提供不同的线程(我不希望这样,我希望代码在始终使用相同的线程)。

然后我转向自己持有调度程序的方法:

class SQLSingleton{

private final Scheduler schedulerIODatabase;

public SQLSingleton(){
schedulerIODatabase = Schedulers.newThread();
}

public Observable<MyObject> query(final String id){

return Observable.fromCallable(() -> {

//database operations here
})
.subscribeOn(schedulerIODatabase)
.observeOn(AndroidSchedulers.mainThread());
}

...
}

因为我是 RxJava 的新手(看起来它有很多陷阱),我问:保持那个 Scheduler 对象存活有什么坏处(记住 SQLSingleton 是一个单例,因此调度程序也将是)?

最佳答案

schedulerIODatabase = Schedulers.newThread();

这没有效果,因为 newThread 每次使用 subscribeOn 时都会发出一个新线程,类似于 io() 但没有线程重用。

您不能在 RxJava 1.x 中固定和重用特定的 RxJava 线程,但您可以在 RxJava 2 中使用它的扩展库组件来做到这一点:SharedScheduler .

在 RxJava 1 中,你必须提供你自己的单线程 ExecutorServiceSchedulers.from 然后它将使用那个单一的 Executor所有 worker 调用。请注意,您必须手动管理 ExecutorService 的生命周期,并在您的应用程序必须终止时将其关闭:

ExecutorService exec = Executors.newSingleThreadedExecutor();

Scheduler singleScheduler = Schedulers.from(exec);

Observable.fromCallable(() -> {
//database operations here
})
.subscribeOn(singleScheduler)
.observeOn(AndroidSchedulers.mainThread());

// ...

exec.shutdown();

关于android - RxJava (Android) - 让调度程序保持 Activity 状态有什么坏处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41353805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com