我正在尝试使用RxJava在本地更新一个对象,因此我可以在一些用户输入后将其发送回服务器。我试图在垂直的RecyclerView中使用水平的RecyclerView,但尝试使用 RxJava 与Room DB异步通信会导致滚动异常。 如果您有任何反馈意见或需要任何其他代码,请告诉我。
没有RxJava
ViewHolder
inner class ScoreViewHolder(view: View) : RecyclerView.ViewHolder(view){
private val mNumberPickerLocal = view.findViewById(R.id.number_picker_local) as ScrollableNumberPicker
private val mNumberPickerAway = view.findViewById(R.id.number_picker_away) as ScrollableNumberPicker
fun bind(scoreboard: Scoreboard, position: Int){
val home = scoreboard.home
val away = scoreboard.away
mNumberPickerLocal.value = home.toInt()
mNumberPickerAway.value = away.toInt()
mNumberPickerLocal.setListener { value ->
println(value)
}
mNumberPickerAway.setListener { value ->
println(value)
}
}
}
使用RxJava
ViewHolder
inner class ScoreViewHolder(view: View) : RecyclerView.ViewHolder(view){
private val mNumberPickerLocal = view.findViewById(R.id.number_picker_local) as ScrollableNumberPicker
private val mNumberPickerAway = view.findViewById(R.id.number_picker_away) as ScrollableNumberPicker
fun bind(scoreboard: Scoreboard, position: Int){
val home = scoreboard.home
val away = scoreboard.away
mNumberPickerLocal.value = home.toInt()
mNumberPickerAway.value = away.toInt()
mNumberPickerLocal.setListener { value ->
mDisposable.add(userMatchesVM.updateHomeScore(value.toLong(), scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnComplete { println("LOCAL SCORE = $value") }
.subscribe())
// Gettting Flowable<Object>
mDisposable.add(userMatchesVM.getUsermatchByID(scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnNext {
FirestoreBackend.updateFirebaseMatch(it, "SCORE VH")
}
.subscribe())
}
mNumberPickerAway.setListener { value ->
mDisposable.add(userMatchesVM.updateAwayScore(value.toLong(), scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnComplete { println("AWAY SCORE = $value") }
.subscribe())
// Gettting Flowable<Object>
mDisposable.add(userMatchesVM.getUsermatchByID(scoreboard.id)
.subscribeOn(Schedulers.io())
.doOnNext {
FirestoreBackend.updateFirebaseMatch(it, "WINNER VH")
}
.subscribe())
}
}
}
UsermatchesViewModel.kt
fun updateHomeScore(home: Long, id: String): Completable =
Completable.fromAction { mFantasyDB.usermatchesDAO().updateHomeScore(home, id) }
fun updateAwayScore(away: Long, id: String): Completable =
Completable.fromAction { mFantasyDB.usermatchesDAO().updateAwayScore(away, id) }
fun getUsermatchByID(id: String): Flowable<Usermatches> =
mFantasyDB.usermatchesDAO().getUsermatch(id)
UsermatchesDAO
@Query("update usermatches set home_score = :home where usermatches_id = :id")
fun updateHomeScore(home: Long, id: String)
@Query("update usermatches set away_score = :away where usermatches_id = :id")
fun updateAwayScore(away: Long, id: String)
@Query("select * from usermatches where usermatches_id = :id limit 1")
fun getUsermatch(id: String): Flowable<Usermatches>
答案 0 :(得分:1)
此问题的解决方案在于您如何实现可观察的类型,这意味着:我正在使用Flowable<Object>
到1的对象,这导致每次刷新它用户输入被注册的时间。为了解决这个问题,我将 ViewModel和DAO的更改为 Single 。
ViewModel
fun getMatchesByID(id: String): Single<Matches> =
mFantasyDB.matchesDAO().getMatchesByID(id)
DAO
@Query("select * from matches where match_id = :id")
fun getMatchesByID(id: String): Single<Matches>