Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在Kotlin Lambda中调用RxJava单_Android_Rx Java_Kotlin_Rx Java2 - Fatal编程技术网

Android 在Kotlin Lambda中调用RxJava单

Android 在Kotlin Lambda中调用RxJava单,android,rx-java,kotlin,rx-java2,Android,Rx Java,Kotlin,Rx Java2,我正在尝试修补新库,将其与RxJava配对 我找到了一种方法,可以使用单个在后台线程中插入项目,如下所示,在活动内部: Single.fromCallable { AppDatabase.getInMemoryDatabase(this).taskDao().insertAll(task) } .subscribeOn(Schedulers.newThread()) .subscribe() 现在,我有了一个包含任

我正在尝试修补新库,将其与RxJava配对

我找到了一种方法,可以使用
单个
在后台线程中插入项目,如下所示,在活动内部:

Single.fromCallable { AppDatabase.getInMemoryDatabase(this).taskDao().insertAll(task) }
                    .subscribeOn(Schedulers.newThread())
                    .subscribe()
现在,我有了一个包含任务的RecyclerView,其中有一个复选框,您可以使用它将项目标记为完成或未完成。我想做的是在每次选中/取消选中项目时更新它。我将粘贴整个ViewHolder以供完成,但请特别注意
bindTask()
中的lambda:


这适用于我选中的第一个项目,但之后我无法单击任何其他复选框。我原以为
单曲
会自我毁灭,但也许我不能在lambda里面做到这一点?我需要把单曲拉出来吗

我还没有测试过,但应该可以

class TaskViewHolder(view: View?) : RecyclerView.ViewHolder(view) {

    val descriptionTextView: TextView? = null
    val completedCheckBox: CheckBox? = null

    fun bindTask(task: Task) {
        descriptionTextView?.text = task.description
        completedCheckBox?.isChecked = task.completed

        completedCheckBox?.setOnCheckedChangeListener { _, isChecked ->
            tasks[adapterPosition].completed = isChecked

            itemView.context.taskDao().update(tasks[adapterPosition])
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ changeCount -> Timber.i("%,d item(s) updated", changeCount) },
                           { error -> Timber.e(error, "update failed") })
        }
    }
}

interface TaskDao {
    fun update(task: Task): Flowable<Int>
}
class TaskViewHolder(视图:视图?):RecyclerView.ViewHolder(视图){
val descriptionTextView:TextView?=null
val completedCheckBox:复选框?=null
有趣的任务(任务:任务){
descriptionTextView?.text=task.description
completedCheckBox?.isChecked=task.completed
completedCheckBox?.setOnCheckedChangeListener{{,isChecked->
任务[adapterPosition].completed=isChecked
itemView.context.taskDao().update(任务[adapterPosition])
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({changeCount->Timber.i(“%,d项更新”,changeCount)},
{error->Timber.e(错误,“更新失败”)}
}
}
}
接口TaskDao{
乐趣更新(任务:任务):可流动
}

不是创建新的
单个
而是使用

我将使用
可观察创建可观察。创建
,使用lambda保存发射器,并使用
emitter.onNext()

class TaskViewHolder(视图:视图):RecyclerView.ViewHolder(视图)
{
私有lateinit var发射器:ObservableEmitter
private val disposable:disposable=Observable.create(ObservableOnSubscribe{e->emitter=e})
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.newThread())
.subscribe({itemView.context.taskDao().update(it)})
val descriptionTextView=view?.findViewById(R.id.task_description)作为?TextView
val completedCheckBox=查看?.findViewById(R.id.task_completed)为?复选框
有趣的任务(任务:任务){
descriptionTextView?.text=task.description
completedCheckBox?.isChecked=task.completed
completedCheckBox?.setOnCheckedChangeListener{{,isChecked->
任务[adapterPosition].completed=isChecked
emitter.onNext(任务[适配器位置])
}
}
}

Hmm Room告诉我更新方法必须返回void或int。是否可能
Flowable
只能用于查询?我使用Room和RxJava,但不能组合使用:-(你已经在你的build.gradleYes中添加了
android.arch.persistence.room:rxjava2
。我有它。我想它只用于查询。对于插入、更新和删除,我必须创建Flowables/Singles/whateverrx组件才能在新线程上执行。我本以为我在这里就是这么做的,但我在幕后发生了一些事情不完全理解我想我可以在
onPause()时访问列表
在活动中被调用,并让它循环并更新整个列表?解决此问题很好,但我认为这正是我将尝试解决的问题。请不要仅使用。也许您需要一个来访问外部类感谢您的建议。我已经解决了这个问题。我将使用Observable.c创建成员变量发射器创建(ObservateOnSubscribe{e->emitter=e})。您的Rxlogic和内部设置CheckedChangeListener我将使用emitter.onNext(someValue)来传递rx流。您能举一个例子说明如何为更新代码添加rx逻辑吗?我尝试将
.subscribebeon(Schedulers.newThread()).subscribe({itemView.context.taskDao().update(it)})
但我继续收到“无法访问主线程上的数据库”错误。好的,您的订阅很好,请尝试使用
.observeOn(Schedulers.newThread())
而不是
订阅
,您实际上是在主UI线程上订阅。这对我来说很有效!我将用我的确切代码更新答案,以帮助未来的读者。谢谢!)
class TaskViewHolder(view: View?) : RecyclerView.ViewHolder(view) {

    val descriptionTextView: TextView? = null
    val completedCheckBox: CheckBox? = null

    fun bindTask(task: Task) {
        descriptionTextView?.text = task.description
        completedCheckBox?.isChecked = task.completed

        completedCheckBox?.setOnCheckedChangeListener { _, isChecked ->
            tasks[adapterPosition].completed = isChecked

            itemView.context.taskDao().update(tasks[adapterPosition])
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ changeCount -> Timber.i("%,d item(s) updated", changeCount) },
                           { error -> Timber.e(error, "update failed") })
        }
    }
}

interface TaskDao {
    fun update(task: Task): Flowable<Int>
}
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])
        }
    }
}