Как мне ждать других событий в соплинских котлин? - PullRequest
2 голосов
/ 26 апреля 2019

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

Что-то похожее на это:

button.setOnClickListener {
    CoroutineScope(...).launch{
        print("Button clicked")

        // How to wait for "onStop()" ?

        print("Activity stopped")
    }
}

Приведенный выше сценарий является лишь примером общей необходимости включения асинхронных событий, которые приходят из SDK, в форме вызова функции (onStop()).

Какэто должно быть сделано?Спасибо:]

Ответы [ 2 ]

3 голосов
/ 26 апреля 2019

Я бы создал специальный канал для кнопки, затем отправил бы ей что-нибудь с onStop(0) и дождался бы этого в вашем коде:

val onStopChannel = Channel<Int>()

fun onStop() {
    onStopChannel.offer(0)
}

button.setOnClickListener {
    CoroutineScope(...).launch{
        print("Button clicked")

        onStopChannel.receive()

        print("Activity stopped")
    }
}

Может работать и любая другая наблюдаемая.

0 голосов
/ 26 апреля 2019

Я бы заставил свою работу ждать с функцией join(), а затем отменил бы ее в onStop() обратном вызове. Что-то вроде:

class MainActivity : AppCompatActivity() {
    private var job: Job = Job()
    private val mainDispatchersContext = CoroutineScope(Dispatchers.Main)
    private val coroutineContext = CoroutineScope(Dispatchers.Main + job)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mainDispatchersContext.launch {
            doJob()
        }
    }

    private suspend fun doJob() {
        coroutineContext.launch {
            // do something
            Log.v(TAG, "Job started")
            job.join()
            Log.v(TAG, "This line is not executed")
        }
    }

    override fun onStop() {
        super.onStop()
        job.cancel()
        Log.v(TAG, "Job end")
    }

    companion object{
        const val TAG = "MainActivity"
    }
}
...