AsyncTask'ı Kotlin'in Coroutine'leriyle nasıl değiştirebilirim?

Android uygulamalarınızda hala AsyncTask'ı kullanıyor musunuz? Muhtemelen artık olmamalısın. Bunları Kotlin'in Coroutine'leriyle nasıl değiştireceğiniz aşağıda açıklanmıştır.

Android'de çok uzun bir süre boyunca, bir uygulama yaparken eşzamansız olarak herhangi bir şey yapmanız gerekiyorsa muhtemelen AsyncTask'ı kullanıyor olurdunuz. AsyncTask, Android çerçevesinde, işlemleri arka planda çalıştırmayı ve bittiğinde değerleri döndürmeyi kolaylaştıran (ish) bir API'dir. Ve bu mantıklı. Kotlin'in Coroutines'inden farklı olarak AsyncTask bir süredir ortalıkta ve yerleşik olarak bulunuyor.

Bununla birlikte, AsyncTask'ın hem tasarım felsefesi hem de uygulaması yıllar geçtikçe biraz modası geçmiş hale geldi. Bu nedenle Google'ın AsyncTask API'si kullanımdan kaldırıldı. İsterseniz yine de kullanabilirsiniz ancak Google bunu yapmanızı önermez. Neyse ki, Kotlin dilinin bir özelliği olan eşyordamlar da dahil olmak üzere AsyncTask'ın bir sürü alternatifi var.

Kotlin'in coroutines API'si, birçok şeyi yapmanıza olanak tanıyan inanılmaz derecede güçlü bir çerçevedir. Bu makale sadece mümkün olanın yüzeyini çizecek. AsyncTask'tan eşyordamlara geçiş için gereken temel bilgilerin üzerinden geçeceğiz.

Coroutine Desteği Ekleme

Eşyordamları kullanmaya başlamadan önce onları projenize eklemeniz gerekir.

Kotlin Desteği Ekleme

Kotlin'i zaten uyguladıysanız bir sonraki bölüme geçin. Aksi takdirde projenize Kotlin desteğini eklemeniz gerekecektir. Daha fazla ayrıntı için Kotlin'i mevcut bir projeye ekleme konusundaki eğitimime göz atın.

Coroutine Kitaplıkları Ekleme

Modül seviyenizde build.gradle, aşağıdaki bağımlılıkları ekleyin.

dependencies {
...
implementation 'org.jetbrains.kotlinx: kotlinx-coroutines-core: 1.5.0'
implementation 'org.jetbrains.kotlinx: kotlinx-coroutines-android: 1.5.0'
}

Projenizi senkronize ettiğinizde Kotlin'in eşyordamları artık kullanıma hazır olacaktır.

Coroutine'leri Kullanma

CoroutineScope'u Uygulamak

Eşyordamları kullanmak için bir CoroutineScope örneğinin mevcut olması gerekir. Bunu yapmanın kolay bir yolu, onu içeren sınıfınıza uygulamaktır.

Örneğin, bir Faaliyette CoroutineScope uygulamak için:

classSomeActivity : AppCompatActivity, CoroutineScope by MainScope() {
...

override fun onDestroy(){
super.onDestroy()

cancel()
}
}

Bu, SomeActivity'nin CoroutineScope arayüzünü MainScope sınıfı aracılığıyla uygulamasını sağlayacaktır. MainScope, CoroutineScope'un tüm uygulama mantığını yönetirken CoroutineScope yöntemlerini kullanmanıza da olanak tanır. Arama cancel() içinde onDestroy() Etkinlik çıktıktan sonra hiçbir eşzamansız mantığın çalışmaya devam etmemesini sağlar.

AsyncTask'ı Coroutine'lerle değiştirme

Arka planda uzun süren bir işlem gerçekleştiren ve sonunda bir String döndüren bir Activity içinde bir AsyncTask'ınız olduğunu varsayalım. Aşağıdaki gibi bir şey.

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
}
}

Bunu bir koroutinle değiştirmek kolaydır. Sadece şunu kullan async() yöntem. Kotlin'in async() başlatıldığı iş parçacığında çalışır, ancak bunu eşzamansız olarak yapar. Bu, doğru Konuyu kullanma konusunda endişelenmenize gerek kalmadan Görünümleri ve benzerlerini güncelleyebileceğiniz anlamına gelir.

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"
}
}
}

Gördüğünüz gibi eşyordamları kullanmak AsyncTask'ı kullanmaktan çok daha basit olabilir. Sadece aramanıza gerek yok async() ve yine de bırakalım işini yapsın. Ona bir referans tutabilir ve hatta bitmesini bekleyebilirsiniz.

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()

Async ile değerlerin döndürülmesi

Hatta bir değer bile döndürebilirsiniz. async() eğer istersen. Yani orijinal örnek bunun gibi bir şey olabilir.

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
}
}

withContext'i kullanma

Kolaylık sağlamak için Kotlin şunları sağlar: withContext(). Bu bütünü satırlar arası await() şey ve sadece değeri size döndürür.

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
}
}

Çözüm

Yukarıdaki örnekler, başlamanıza yardımcı olacak Kotlin eşyordamlarının yalnızca bazı temel kullanımlarıdır. Eşyordamları Faaliyetlerle ve hatta uygun yaşam döngüsüne sahip herhangi bir şeyle sınırlamanıza gerek yok. Bunları temelde her yerde çalıştırabilirsiniz. Hangi İş Parçacığının eşzamansız mantığı çalıştırması gerektiğini seçmek gibi daha gelişmiş işlemler de vardır. Bu kılavuz temel olarak basit bir AsyncTask'ın basit bir eşyordamla nasıl değiştirileceğini göstermek içindir.

Eşyordamların nasıl çalıştığı ve onların daha gelişmiş özelliklerinden nasıl yararlanabileceğiniz hakkında daha fazla ayrıntı için şuraya göz atın: resmi Kotlin belgeleri.