Как вывести значения из разных функций, но собрать их все в одном месте? Поток Kotlin - PullRequest
0 голосов
/ 03 мая 2020

В своей деятельности мне нужно генерировать различные значения потока для обратных вызовов, таких как:

  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 Ответ

1 голос
/ 03 мая 2020

Как насчет этого?:

Создать интерфейс для уведомления о каждом обратном вызове, переопределенном методе и т. Д. c. вам нужно:

interface Notifier<T> {
    fun notify(t: T)
}

Внутри вашего класса объявите объект для реализации этого интерфейса:

private var notifier: Notifier<Int>? = null

Также объявите поток с компоновщиком callbackFlow, где вы инициализируете объект уведомителя:

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)
}

И, наконец, используйте Поток следующим образом:

val job = launch(Dispatchers.Default) {
    myClassReference.myFlow
        .collect {
            when(it) {
                1 -> { println("It's one") }
                2 -> { println("It's two") }
            }
        }
}

И обязательно отмените job должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...