【发布时间】:2018-06-07 04:29:27
【问题描述】:
我很难理解 Flowable 在 Room 中的工作原理。我有 Dao 这样的方法
@Insert(onConflict = OnConflictStrategy.REPLACE)
void upsert(List<Site> sites);
@Query("SELECT * FROM site ORDER BY distance ASC")
Flowable<List<Site>> getSites();
我希望每当我调用upsert 订阅者到Flowable 时,getSites() 返回的对象总是会被调用。我的假设是真的吗?
这就是我订阅这个 flowable 的方式
private final Flowable<List<Site>> siteFlowable;
ApiService apiService;
FuelDatabase database;
@Override
public void getSites(boolean showOnlyKeySites) {
// add sites from cache first, then fetch network -> update cache -> update ui
disposable = siteFlowable.flatMap(Flowable::fromIterable)
.filter(site -> site.isValid())
.buffer(100, TimeUnit.MILLISECONDS, 20)
.takeUntil(sites -> sites.size() == 0)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(mapView::addPins)
.subscribe(sites -> {
Timber.d("Flowable emitted %d items", sites.size());
}, Timber::e);
apiService.getSites()
.map(SiteListResponse::getData)
.flatMap(Observable::fromIterable)
.filter(Site::isValidSite)
.toList().toObservable()
.subscribe(sites -> {
Timber.i("Success Fetching %d sites", sites.size());
database.siteDao().clear();
database.siteDao().upsert(sites);
}, throwable -> Timber.e(throwable, "Error fetching sites"));
}
在调用 upsert() 之后不会调用这个 flowable。 API 正在返回有效数据,数据正在输入数据库中。
【问题讨论】:
-
AFAIK 房间查询是无限的,因此
toList不会对它们起作用。见stackoverflow.com/a/47260768/61158 -
@akarnokd 你在哪里看到
toList()查询? -
我认为在 toObservable() 之后你需要使用 flatMap 并隐蔽 upsert 到另一个可流动的流中
-
@Rahul 你能详细说明一下吗?
-
getSites与 Room 数据库对话,对吗?它返回的 Flowable 是无限的,因此toList永远不会完成。
标签: android rx-java2 android-room android-database android-architecture-components