Ar vis dar naudojate „AsyncTask“ savo „Android“ programose? Jūs tikriausiai nebeturėtumėte būti. Štai kaip jas pakeisti Kotlin's Coroutines.
Labai ilgą laiką naudojant „Android“, jei kuriant programą reikėjo ką nors daryti asinchroniškai, tikriausiai naudojote „AsyncTask“. „AsyncTask“ yra „Android“ sistemos API, kuri leidžia lengvai (ish) vykdyti operacijas fone ir grąžinti reikšmes, kai baigsite. Ir tai turi prasmę. Skirtingai nuo Kotlino Coroutines, „AsyncTask“ egzistuoja jau kurį laiką ir yra integruota.
Tačiau tiek dizaino filosofija, tiek „AsyncTask“ įgyvendinimas bėgant metams šiek tiek paseno. Dėl to Google turi nebenaudojama „AsyncTask“ API. Jei norite, vis tiek galite jį naudoti, tačiau „Google“ nerekomenduoja to daryti. Laimei, yra daugybė „AsyncTask“ alternatyvų, įskaitant „Kotlin“ kalbos ypatybę - korutinas.
Kotlin's coroutines API yra neįtikėtinai galinga sistema, leidžianti atlikti daugybę dalykų. Šis straipsnis tik subraižys tai, kas įmanoma. Peržiūrėsime pagrindus, reikalingus norint pereiti nuo „AsyncTask“ į „coroutines“.
Korutinių palaikymo pridėjimas
Prieš pradėdami naudoti korutinas, turite jas iš tikrųjų įtraukti į savo projektą.
Pridedamas Kotlin palaikymas
Jei jau įdiegėte „Kotlin“, pereikite prie kito skyriaus. Priešingu atveju turėsite pridėti Kotlin palaikymą prie savo projekto. Norėdami gauti daugiau informacijos, peržiūrėkite mano mokymo programą, kaip įtraukti Kotliną prie esamo projekto.
Korutino bibliotekų pridėjimas
Jūsų modulio lygiu build.gradle
, įtraukite toliau nurodytas priklausomybes.
dependencies {
...
implementation 'org.jetbrains.kotlinx: kotlinx-coroutines-core: 1.5.0'
implementation 'org.jetbrains.kotlinx: kotlinx-coroutines-android: 1.5.0'
}
Sinchronizuokite savo projektą ir dabar bus galima naudoti Kotlino programas.
Korutinos naudojimas
CoroutineScope diegimas
Kad galėtumėte naudoti korutinas, turėsite turėti CoroutineScope egzempliorių. Paprastas būdas tai padaryti yra tiesiog įdiegti jį savo klasėje.
Pavyzdžiui, norėdami įdiegti CoroutineScope veikloje:
classSomeActivity : AppCompatActivity, CoroutineScope by MainScope() {
...
override fun onDestroy(){
super.onDestroy()
cancel()
}
}
Tai privers „SomeActivity“ įdiegti „CoroutineScope“ sąsają per „MainScope“ klasę. MainScope tvarkys visą CoroutineScope diegimo logiką, leisdamas naudoti CoroutineScope metodus. Skambina cancel()
in onDestroy()
užtikrina, kad jokia asinchroninė logika ir toliau neveiktų pasibaigus veiklai.
„AsyncTask“ pakeitimas į „Corutes“.
Tarkime, kad veikloje turite AsyncTask, kuri atlieka ilgai trunkančią operaciją fone ir galiausiai grąžina eilutę. Kažkas panašaus į toliau pateiktą.
private inner classSomeTask : AsyncTask
() {
override fun doInBackground(vararg params: Void): String {
try {
//Pretend this is an actual operation that takes 10 seconds and not just sleeping.
Thread.sleep(10000);
} catch (e: InterruptedException) {}
return"SomeString";
}
override fun onPostExecute(result: String) {
val someTextView = findViewById(R.id.some_text_view)
someTextView.text = result
}
}
Tai lengva pakeisti korutina. Tiesiog naudokite async()
metodas. Kotlino async()
veikia bet kurioje gijoje, kurioje buvo paleistas, bet tai daro asinchroniškai. Tai reiškia, kad galite atnaujinti rodinius ir panašius dalykus nesijaudindami dėl tinkamos gijos naudojimo.
classSomeActivity : AppCompatActivity(), CoroutineScope by MainScope() {
...private fun doOperation(){
async {
//Inside coroutine scopes (like inside async here), delay is used instead of Thread.sleep.
delay(10000)
val someTextView = findViewById(R.id.some_text_view)
someTextView.text = "SomeString"
}
}
}
Kaip matote, naudoti korutines gali būti daug paprasčiau nei naudoti AsyncTask. Nereikia tik skambinti async()
ir tegul daro savo. Galite laikyti nuorodą į jį ir net laukti, kol jis baigsis.
val asyncJob = async {
//Some operation
}
//Pause here until the async block is finished.
asyncJob.await()
//This won't run until asyncJob finishes, but other operations started before the job, or started from another method, can still run.
doSomethingElse()
Grąžinamos reikšmės naudojant async
Jūs netgi galite grąžinti vertę iš async()
Jeigu nori. Taigi originalus pavyzdys galėtų tapti tokiu.
classSomeActivity : AppCompatActivity(), CoroutineScope by MainScope() {
...
private fun doOperation(){
val asyncJob = async {
//Inside coroutine scopes (like inside async here), delay is used instead of Thread.sleep.
delay(10000)//Whatever the type is of the last line is what async() eventually returns.
"SomeString"
}val result = asyncJob.await()
val someTextView = findViewById(R.id.some_text_view)
someTextView.text = result
}
}
Naudojimas su kontekstu
Patogumui Kotlin suteikia withContext()
. Tai įtraukia į visumą await()
dalykas ir tiesiog grąžina jums vertę.
classSomeActivity : AppCompatActivity(), CoroutineScope by MainScope() {
...
private fun doOperation(){
//Run asynchronously on the main Thread.
val result = withContext(Dispatchers.Main) {
delay(10000)"SomeResult"
}
val someTextView = findViewById(R.id.some_text_view)
someTextView.text = result
}
}
Išvada
Aukščiau pateikti pavyzdžiai yra tik keletas pagrindinių Kotlin korutinų naudojimo būdų, kaip pradėti. Jūs neprivalote apriboti periodinių veiksmų iki veiklos ar net bet kuo, kurio gyvavimo ciklas yra tinkamas. Galite juos paleisti iš esmės bet kur. Taip pat yra sudėtingesnių operacijų, pvz., pasirinkimas, kuriai gijai vykdyti asinchroninę logiką. Šis vadovas daugiausia skirtas parodyti, kaip paprastą „AsyncTask“ pakeisti paprasta korutina.
Norėdami gauti daugiau informacijos apie tai, kaip veikia korutina ir kaip galite pasinaudoti pažangesnėmis jų funkcijomis, žr oficialūs Kotlin dokumentai.