【发布时间】:2017-11-12 15:20:05
【问题描述】:
我正在尝试修改新的 Room 库以将其与 RxJava 配对。
我找到了一种使用Single 在后台线程上插入项目的方法,就像这样,在活动内部:
Single.fromCallable { AppDatabase.getInMemoryDatabase(this).taskDao().insertAll(task) }
.subscribeOn(Schedulers.newThread())
.subscribe()
现在,我有一个包含任务的 RecyclerView,其中包含一个复选框,您可以使用该复选框将项目标记为完成与否。我想要做的是每次选中/取消选中时更新项目。我将粘贴整个 ViewHolder 以完成,但请特别注意 bindTask() 中的 lambda:
inner class TaskViewHolder(view: View?) : RecyclerView.ViewHolder(view) {
val descriptionTextView = view?.findViewById(R.id.task_description) as? TextView
val completedCheckBox = view?.findViewById(R.id.task_completed) as? CheckBox
fun bindTask(task: Task) {
descriptionTextView?.text = task.description
completedCheckBox?.isChecked = task.completed
completedCheckBox?.setOnCheckedChangeListener { _, isChecked ->
tasks[adapterPosition].completed = isChecked
Single.fromCallable { itemView.context.taskDao().update(tasks[adapterPosition]) }
.subscribeOn(Schedulers.newThread())
.subscribe()
}
}
}
这适用于我检查的第一项,但之后我无法单击任何其他复选框。我认为Single 会自我毁灭,但也许我不能在 lambda 中做到这一点?我需要以某种方式将 Single 拉到外面吗?
【问题讨论】:
-
请不要使用
inner class TaskViewHolder,只使用class TaskViewHolder到prevent memory leaks。也许你需要一个WeakReference 来访问外部类 -
感谢您的建议。我已经解决了。
-
我将使用 Observable.create(ObservableOnSubscribe
{ e->emitter = e}).yourRxLogic 和 setOnCheckedChangeListener 创建成员变量发射器,我将使用发射器.onNext(someValue) 将其传递给 rx流。
标签: android rx-java kotlin rx-java2