Как выдавать значения из разных функций, но собирать их все в одном месте? Поток Котлин
В моей деятельности мне нужно выдавать разные значения потока для обратных вызовов, например:
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->..
}
}
Является ли это возможным?
1 ответ
Как насчет этого?:
Создайте интерфейс для уведомления о каждом обратном вызове, переопределенном методе и т. Д., Которые вам нужны:
interface Notifier<T> {
fun notify(t: T)
}
Внутри вашего класса объявите объект для реализации этого интерфейса:
private var notifier: Notifier<Int>? = null
Также объявите поток с callbackFlow
Builder, в котором вы инициализируете объект уведомителя:
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
должным образом.