2017-05-30 61 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)來使其工作! –