大家度过美好的时光。
我想知道是否有可能在与下一个线程不同的线程上发出Flowable的元素。 例如,我有一个热的数据库对象内存缓存,而我不想去io线程从那里获取元素。 我想做的基本上是:
if (cache.contains(e)) {
emiter.emit(cache.get(e));
} else {
Io.post(() -> emiter.emit(db.get(e)));
}
我需要相同的Flowable才能使用不同的线程。 到目前为止,我还没有找到一种方法。可以吗?
答案 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