Блок кода внутри withContext (Dispatchers.Main) не работает - PullRequest
0 голосов
/ 24 февраля 2020

Я новичок в сопрограмм . Я использую приведенный ниже код для получения списка musi c на устройстве пользователя и его отображения. Но код внутри блока withContext, похоже, не работает. Приложение просто выходит, как только оно запускается. И нет никаких проблем, напечатанных в logcat .

    private suspend fun fetchMusic() {
        CoroutineScope(Dispatchers.IO).launch {
            val mediaList = getAllAudioFromDevice(this@MainActivity)
            setListOnMainThread(mediaList)
        }
    }

    private suspend fun setListOnMainThread(mediaList: List<MusicModel>){
        withContext(Dispatchers.Main) {
            setData(mediaList)
        }
    }

В чем может быть проблема здесь? Спасибо.

1 Ответ

1 голос
/ 25 февраля 2020

launch создает новую сопрограмму и запускает ее, не дожидаясь ее завершения sh.

Как правило, чистая реализация сопрограмм будет состоять в том, чтобы каждая функция приостановки переключалась на соответствующий диспетчер. Если это действие, которое вы собираетесь выполнять только в фоновом режиме, функция должна начинаться с = withContext. Например, в вашем случае, если getAllAudioFromDevice - это то, что вы всегда хотите делать в фоновом режиме, оно должно выглядеть следующим образом:

private suspend fun getAllAudioFromDevice() = withContext(Dispatchers.IO) {
    // fetch it
    // return it
}

, и тогда ваш fetchMusic будет намного проще:

private suspend fun fetchMusic() {
    val mediaList = getAllAudioFromDevice(this@MainActivity)
    setListOnMainThread(mediaList)
}

или, может быть, getAllAudioFromDevice () - это функция, которую вы хотите вызывать на переднем или заднем плане, а не обязательно из сопрограммы. Затем вы должны оставить все как есть (не приостанавливать функцию) и обернуть вызовы в withContext() по мере необходимости следующим образом:

private suspend fun fetchMusic() {
    val mediaList = withContext(Dispatchers.IO) {
        getAllAudioFromDevice(this@MainActivity)
    }
    setListOnMainThread(mediaList)
}

Вы также упоминаете о выходе из приложения, как только оно запускается. Почему это выходит? Есть ли необработанное исключение с трассировкой стека, на которое мы можем посмотреть?

...