Android 子订阅到RxJava';可流动数据
我想写一个函数,它自动将RxJava的Android 子订阅到RxJava';可流动数据,android,kotlin,rx-java2,reactive,Android,Kotlin,Rx Java2,Reactive,我想写一个函数,它自动将RxJava的Flowable子脚本化,并获取结果数据。然后,该数据将作为参数传递给另一个进行处理的方法。我正在努力学习Kotlin的扩展函数语法和泛型 我要转换此呼叫: val scheduler = Schedulers.newThread() disposable.add( viewModel.getExams().subscribeOn(scheduler) .observeOn(scheduler)
Flowable
子脚本化,并获取结果数据。然后,该数据将作为参数传递给另一个进行处理的方法。我正在努力学习Kotlin的扩展函数语法和泛型
我要转换此呼叫:
val scheduler = Schedulers.newThread()
disposable.add(
viewModel.getExams().subscribeOn(scheduler)
.observeOn(scheduler)
.subscribe({ exams ->
exams.forEach {
getSubjectOfExam(it, Schedulers.newThread())
}
}, { error ->
Log.e(
"OverviewFragment",
"Unable to fetch list, $error"
)
})
)
在我的活动中
代码非常长,返回我要处理的数据的方法
在本例中,我希望将考试列表(list
)传递到getSubjectOfExam()
的参数中,这是列表处理的方法
到目前为止,我的函数可以编译,但根本不起作用:
/**
* General subscription of items in a Flowable list
* @param f method to be executed when list is loaded
* @param scheduler scheduling units
*/
private fun Flowable<out List<Any>>.listSubscribe(
f: (List<Any>) -> Unit,
scheduler: Scheduler
) {
disposable.add(
this.subscribeOn(scheduler)
.observeOn(scheduler)
.subscribe({
f(it)
}, { error ->
Log.e(
"OverviewFragment",
"Unable to fetch list, $error"
)
})
)
}
所以,是的,我试着做一个扩展函数,并传递一个函数作为它的参数之一(我相信称为高阶函数)
使用我的方法,getSubjectOfExam
根本不会被调用。有什么我遗漏的吗
在我的活动中,我将一直订阅
Flowable
,因此此功能将真正帮助我。我尝试了您的代码,它似乎工作正常。是否有可能viewModel.gettests()
或getSubjectOfExam()
不起作用
此外,我还可以提出一些优化建议:
protected fun <T> Flowable<out List<T>>.listSubscribe(
f: (List<T>) -> Unit,
scheduler: Scheduler
) {
disposable.add(
this.subscribeOn(scheduler)
.observeOn(scheduler)
.subscribe(f, { error ->
Log.e(
"OverviewFragment",
"Unable to fetch list, $error"
)
})
)
}
事实上,您可以将
List
替换为T
,并使其适用于任何类型。而且,观察和订阅同一个调度程序对我来说没有多大意义。我认为您可以完全删除。observeOn
,代码仍将在您放入的同一个计划程序中进行观察。subscribeOn
非常感谢您提供的提示!经过几个小时的调试,我确实发现getExams()中还没有任何内容,这一定是我的insertExam方法中的一个bug。
protected fun <T> Flowable<out List<T>>.listSubscribe(
f: (List<T>) -> Unit,
scheduler: Scheduler
) {
disposable.add(
this.subscribeOn(scheduler)
.observeOn(scheduler)
.subscribe(f, { error ->
Log.e(
"OverviewFragment",
"Unable to fetch list, $error"
)
})
)
}
viewModel.getExams().listSubscribe({ resultData ->
resultData.forEach {
getSubjectOfExam(exam, Schedulers.newThread())
}
}, Schedulers.newThread())