Избегайте использования GlobalScope
. Вы должны использовать lifecycleScope
, чтобы запустить сопрограмму внутри вашего представления.
Сначала вам нужно добавить androidx.lifecycle:lifecycle-runtime-ktx:{version}
в свой файл gradle.
Предполагая, что вы хотите показать в тосте, что downloadChapters
возвращается, тогда я бы сделал это так:
Внутри действия:
findViewById<FloatingActionButton>(R.id.fab).setOnClickListener { view ->
lifecycleScope.launch {
val message = downloadChapters(this@MyActivity, "https://www.novel.com/chap1.html")
//Show toast here
}
}
Внутри фрагмента:
findViewById<FloatingActionButton>(R.id.fab).setOnClickListener { view ->
viewLifecycleOwner.lifecycleScope.launch {
val message = downloadChapters(context, "https://www.novel.com/chap1.html")
//Show toast here
}
}
Поскольку lifecycleScope.launch
работает на Основной поток вы должны изменить его контекст на Dispatchers.IO
во время downloadChapters
, поэтому ваш метод должен выглядеть примерно так:
suspend fun downloadChapters(context : Context, startingChapUrl : String) : String = withContext(Dispatchers.IO) {
//download chapters.
"This is my message" //Return your message here
}
Вы не можете обновить свое представление внутри downloadChapters
, если вы не перейдете на Dispatchers.Main
перед тем, как вы это сделаете, иначе будет сгенерировано исключение. Лучше сделаю это после вызова этого метода.