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)
}
Вы также упоминаете о выходе из приложения, как только оно запускается. Почему это выходит? Есть ли необработанное исключение с трассировкой стека, на которое мы можем посмотреть?