2017-05-30 5 views
1

私はRxJava2で新しいAndroid永続ライブラリlibを使用しています。次のコードは、無限ループを引き起こしています。 2番目のオブザーバブルでユーザーを更新する行をコメントアウトすると、正常に動作します。私がそこに放置すると、最初のオブザーバブルのonNextメソッドが繰り返し呼び出されます。ルーム+無限ループのRxJava2ケース

ルームは、エンティティが更新されたときにテーブルを再クエリしますか?もしそうなら、なぜ同じストリームにメッセージを再び公開するのですか?これは意図された動作ですか?それは図書館のバグですか?

あなたがuserDao.getAll()イベントに加入すると
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

- ルームは、あなたのオブザーバーonNext()メソッドデータベースのデータが変更されるたびにトリガされます。

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

とその部屋はそうでもう一度onNext()メソッドを呼び出して...と後:そして、あなたのonNext()メソッドの次のあなたは、データベース内のデータを変更します。

+0

ありがとうございます!私はそれを購読する前にtake(1)を呼び出すことによって動作させることができました! –