В build.gradle
изменить библиотеку на
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'
.
Удалить, если было добавлено:
kotlin {
experimental {
coroutines "enable"
}
}
При изменении кода launch
на GlobalScope.launch(Dispatchers.IO)
или GlobalScope.launch(Dispatchers.Main)
.
ОБНОВЛЕНИЕ
Пожалуйста, используйте локальный контекст сопрограммы вместо глобальной области (см., Например, http://kotlinlang.org/docs/reference/coroutines/coroutine-context-and-dispatchers.html).
Для действия
См. https://github.com/Kotlin/kotlinx.coroutines/blob/master/ui/coroutines-guide-ui.md.
Реализация CoroutineScope
:
class YourActivity : AppCompatActivity(), CoroutineScope {
Добавить локальную переменную job
и инициализировать ее:
private lateinit var job: Job
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
job = Job()
}
Создайте контекст сопрограммы и отмените его при уничтожении действия:
override fun onDestroy() {
job.cancel()
super.onDestroy()
}
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
Для фрагмента (аналогично Activity
)
Реализация CoroutineScope:
class YourFragment : Fragment(), CoroutineScope {
Создайте локальную переменную job
и инициализируйте ее в onCreate()
. (Я пытался написать private val job: Job = Job()
, но столкнулся с проблемой, что в ViewPager
вы создадитеFragment
s и их задания. Поскольку мы отменим job
в onDestroy()
во время считывания в ViewPager
, мы должны воссоздать задание).
private lateinit var job: Job
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
job = Job()
}
Создайте контекст сопрограммы и отмените егона фрагменте уничтожить:
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job // You can use different variants here.
override fun onDestroy() {
job.cancel()
super.onDestroy()
}
Пример запуска
Используйте launch
как обычно:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
launch {
// Wait for result of I/O operation without blocking the main thread.
withContext(Dispatchers.IO) {
interactor.getCountry().let {
countryName = it.name
}
}
// Update views in the UI thread.
country.updateCaption(countryName)
}
}
В моем случае возникла проблема, когда я использовал запросы API с обычными обратными вызовами.launch
интерьер внутри обратного вызова не был вызван.Поэтому я переписал этот код с помощью интеракторов.