在RxJava中的另一个线程上发射第一个元素

时间:2019-02-21 08:22:48

标签: java multithreading rx-java2

大家度过美好的时光。

我想知道是否有可能在与下一个线程不同的线程上发出Flowable的元素。 例如,我有一个热的数据库对象内存缓存,而我不想去io线程从那里获取元素。 我想做的基本上是:

    if (cache.contains(e)) {
        emiter.emit(cache.get(e));
    } else {
        Io.post(() -> emiter.emit(db.get(e)));
    }

我需要相同的Flowable才能使用不同的线程。 到目前为止,我还没有找到一种方法。可以吗?

1 个答案:

答案 0 :(得分:0)

考虑以下方法:

private Flowable<String> getDbOnlyIfNotCached(String key) {
    if (cache.contains(key)) {
        return Flowable.just(cache.get(key));
    } else {
        return Flowable.fromCallable(() -> db.get(key))
                .subscribeOn(Schedulers.io());
    }
}

如果cache.contains(key)为true,则所有内容都将在调用线程中运行。如果未缓存该值,将使用io调度程序调用{​​{1}}。


更新:Android中的示例

您可以使用上述方法:

db.get(key)

或者您可以使用getDbOnlyIfNotCached("hit") .subscribe(s -> { // If "hit" is cached, this will be executed in the current thread. Log.d(TAG, Thread.currentThread().getName()); }); getDbOnlyIfNotCached("miss") .subscribe(s -> { // If "miss" is cached, this will be executed in another thread. Log.d(TAG, Thread.currentThread().getName()); }); 在Flowable链中使用它。

flatMap

如果要在主线程上观察,请在链的末尾指定Flowable.just("hello") ./* some other operators */ .flatMap(s -> getDbOnlyIfNotCached(s)) // If "hit" is cached, chain still runs in the current thread. .subscribe(s -> { Log.d(TAG, s + " " + Thread.currentThread().getName()); }); Flowable.just("miss") ./* some other operators */ .flatMap(s -> getDbOnlyIfNotCached(s)) // If "miss" is cached, chain switches to another thread. .subscribe(s -> { Log.d(TAG, Thread.currentThread().getName()); });

observeOn