2017-05-30 97 views
1

我正在使用RxJava2和RxJava2的新Android安装库。以下代码导致无限循环。如果我注释掉更新第二个observable中用户的行,它可以正常工作。如果我把它留在那里,第一个可观察对象的onNext方法将被重新调用。无限循环的房间+ RxJava2案例

当实体更新时,Room会重新查询表吗?如果是这样,为什么它再次发布消息在同一个流?这是预期的行为?这是图书馆的一个错误吗?

val userDao = HeyHeyApp.database.userDao(); 
userDao.getAll() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe({ listOfUsers -> 
     if (!listOfUsers.isEmpty()) { 
      HeyHeyApp.currentUser = listOfUsers.first() 
      HeyHeyApp.currentUser.fcmDeviceId = getDeviceId() 

      Single.fromCallable({ 
       HeyHeyApp.database.userDao() 
        .updateUser(HeyHeyApp.currentUser) 
      }).subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe({ _ -> 
      }) 
     } 
    }) 

回答

2

当您订阅userDao.getAll()事件时 - 每当数据库数据发生更改时,Room会触发您的观察者onNext()方法。然后在你的onNext()方法中改变数据库中的数据:

Single.fromCallable({ 
      HeyHeyApp.database.userDao() 
       .updateUser(HeyHeyApp.currentUser) 
     }).subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe({ _ -> 
     }) 

之后房间再次调用onNext()方法......等等。

+0

谢谢!我设法通过在订阅之前调用take(1)来使其工作! –