【问题标题】:Room + RxJava2 case with infinite loopRoom + RxJava2 无限循环案例
【发布时间】:2017-05-30 14:16:34
【问题描述】:

我正在使用带有 RxJava2 的新 Android 持久性库 Room。以下代码导致无限循环。如果我在第二个 observable 中注释掉更新用户的行,它工作正常。如果我把它留在那里,第一个 observable 的 onNext 方法将被一次又一次地调用。

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

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({ _ ->
             })
        }
    })

【问题讨论】:

    标签: android android-room


    【解决方案1】:

    当您订阅 userDao.getAll() 事件时 - 每次更改数据库数据时,Room 都会触发您的观察者 onNext() 方法。接下来在 onNext() 方法中更改数据库中的数据:

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

    在那个房间之后再次调用你的 onNext() 方法......等等。

    【讨论】:

    • 谢谢!我设法通过在订阅前调用 take(1) 使其工作!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多