gpt4 book ai didi

android - 在 Kotlin Lambda 中调用 RxJava Single

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:34 25 4
gpt4 key购买 nike

我正在尝试修补新的 Room库将其与 RxJava 配对。

我找到了一种方法,可以使用 Single 像这样在 Activity 内部的后台线程上插入项目:

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 会 self 毁灭,但也许我不能在 lambda 中这样做?我需要以某种方式将 Single 拉到外面吗?

最佳答案

我会使用 Observable.create 创建 Observable,使用 lambda 保存发射器,然后使用 setOnCheckedChangeListener 传递下一个项目emitter.onNext()

class TaskViewHolder(view: View) : RecyclerView.ViewHolder(view)
{
private lateinit var emitter: ObservableEmitter<Task>
private val disposable: Disposable = Observable.create(ObservableOnSubscribe<Task> { e -> emitter = e })
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.newThread())
.subscribe({ itemView.context.taskDao().update(it) })
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
emitter.onNext(tasks[adapterPosition])
}
}
}

关于android - 在 Kotlin Lambda 中调用 RxJava Single,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44477568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com