在我的活动中,我需要在类似
的回调中发出不同的流值 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
emit(1)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
emit(1)
}
并收集另一个类,例如:
collect{value->
when(value){
1->..
2->..
}
}
有可能吗?
答案 0 :(得分:1)
如何?
使接口可以在您需要的每个回调,重写的方法等上进行通知。
interface Notifier<T> {
fun notify(t: T)
}
在您的类内部声明一个对象以实现该接口:
private var notifier: Notifier<Int>? = null
还使用callbackFlow
构建器声明一个Flow,您将在其中初始化通知程序对象:
val myFlow = callbackFlow<Int> {
notifier = object: Notifier<Int> {
override fun notify(t: Int) {
launch {
channel.send(t)
}
}
}
awaitClose()
}
您的方法内部会通知您的数据
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
notifier?.notify(1)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
notifier?.notify(2)
}
最后像这样消耗Flow:
val job = launch(Dispatchers.Default) {
myClassReference.myFlow
.collect {
when(it) {
1 -> { println("It's one") }
2 -> { println("It's two") }
}
}
}
并确保正确取消job
。