当我们使用Flowable在插入新的数据库行后获取更新通知时,工作正常 但是当插入在另一个显式事务中完成时,Flowable不会收到通知。
为了说明这个问题,我从BasicRxJavaSample
分叉android-architecture-components
并将{2}的测试方法添加到UserDaoTest.java
@Test
public void testFlowable() {
// When subscribing to the emissions of the user
final TestSubscriber<User> userTestSubscriber = mDatabase.userDao().getUser().test();
userTestSubscriber.assertValueCount(0);
// When inserting a new user in the data source
mDatabase.userDao().insertUser(USER);
userTestSubscriber.assertValueCount(1);
}
这很好用。但是当我在显式事务中执行相同操作时,它不起作用:
@Test
public void testFlowableInTransaction() {
// When subscribing to the emissions of the user
final TestSubscriber<User> userTestSubscriber = mDatabase.userDao().getUser().test();
userTestSubscriber.assertValueCount(0);
// When inserting a new user in the data source
mDatabase.beginTransaction();
try {
mDatabase.userDao().insertUser(USER);
mDatabase.setTransactionSuccessful();
} finally {
mDatabase.endTransaction();
}
userTestSubscriber.assertValueCount(1);
// this fails - the userTestSubscriber is still empty!
}
注意:这个例子当然是简化的,只是为了说明问题。
这是生成的DaoImpl.insertUser()
:
public void insertUser(User user) {
__db.beginTransaction();
try {
__insertionAdapterOfUser.insert(user);
__db.setTransactionSuccessful();
} finally {
__db.endTransaction();
}
}
我们可以看到此代码使用了一个事务,我的测试代码也使用了另一个事务 根据{{3}}文档,嵌套事务应该没问题。
这可能是房间错误吗?
此项目的会议室版本为1.0.0-alpha3
,但我也可以在版本1.0.0-alpha8
(另一个项目)中看到此问题