Android WorkManager Nedir?

ESRA KAYA
Ekmob Developer Studio
2 min readJan 2, 2020

Android Jetpack ile birlikte gelen güzelliklerden biri de WorkManager. Peki ne işe yarıyor, nedir bu WorkManager? Ufak bir örnekle açıklayalım, geliştirdiğiniz uygulama içerisinde arkaplanda yapılması gereken bir görev var ve bu görevin uygulamadan çıkılsa veya cihaz yeniden başlatılsa bile çalışması gerekiyor. İşte WorkManager buna benzer ertelenebilen, bir defalık veya periyodik olarak çalıştırılabilen, birlikte görev zincirleri oluşturulması gereken problemlerin çözümünü kolaylaştırmak için aramıza katıldı. Eğer kullandıysanız Firebase Job Dispatcher ve GCMNetworkManager buna benzer çözümler sağlıyordu.

Android geliştiricileri için pil tüketimi ve data kullanımı önemli bir noktada olduğu için bazı işlemlerin “Wifi bağlantısı sağlandığında” veya “Cihaz şarj edilmeye başlandığında” yapılmasını istiyorsanız burada yine WorkManager sizin imdat çığlıklarınıza koşuyor. Örneğin uygulama verilerinizi bir sunucuyla periyodik olarak senkronize etme ihtiyacı duyarsanız ve uygulamanız API 14 ve üstüne hizmet veriyorsa gönül rahatlığı ile WorkManager’i kullanabilirsiniz.

Projeye WorkManager implement etme:

dependencies {
def work_version = "2.2.0"

// (Java only)
implementation "androidx.work:work-runtime:$work_version"

// Kotlin + coroutines
implementation "androidx.work:work-runtime-ktx:$work_version"

// optional - RxJava2 support
implementation "androidx.work:work-rxjava2:$work_version"

// optional - GCMNetworkManager support
implementation "androidx.work:work-gcm:$work_version"

}

Background task oluşturma:

Görev parçacığınız doWork() fonksiyonunda senkronize olarak çalıştırılır. Aşağıdaki örnekteki gibi görüntüleri yükleyen bir fonksiyon çalıştırabilirsiniz. Bunun diğer dönüş tipleri; Result.failure() veya Result.retry() olabilir. Bu dönüş tipine göre yapmanız gereken işlemleri belirleyebilirsiniz.

class UploadWorker(appContext: Context, workerParams: WorkerParameters)
: Worker(appContext, workerParams) {

override fun doWork(): Result {
// Do the work here--in this case, upload the images.

uploadImages()

// Indicate whether the task finished successfully with the Result
return Result.success()
}
}

Görevin nasıl ve ne zaman çalıştırılacağını yapılandırma:

WorkRequest işin nasıl ve ne zaman yürütüleceğini tanımlar. Görevler bir kerelik veya periyodik olabilir. Bir kerelik WorkRequest’ler için OneTimeWorkRequest kullanılır, periyodik çalışma için PeriodicWorkRequest kullanılır.

val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
.build()

Yazımın ilk kısmında bahsetmiş olduğum ağ kullanılabilirliği gibi görev kısıtlamaları, ya da göreve başlanmadan bir delay verilmesi, giriş çıkışların handle edilmesi gibi durumlar için WorkRequest’inizi özelleştirebilirsiniz. Kafa karışıklığı yaratmaması için bu detayları farklı bir yazıda belirtmek isterim.

Görevin sisteme verilmesi:

WorkRequest’inizi tanımladıktan sonra, artık enqueue() fonksiyonu ile WorkManager ile planlayabilirsiniz.

WorkManager.getInstance(myContext).enqueue(uploadWorkRequest)

Göreviniz çalıştıktan sonra WorkManager’ın durumunu takip etmek için WorkInfo nesnesini kullanabilirsiniz.

WorkManager.getInstance(myContext).getWorkInfoByIdLiveData(uploadWorkRequest.id)
.observe(lifecycleOwner, Observer { workInfo ->
if (workInfo != null && workInfo.state == WorkInfo.State.SUCCEEDED) {
displayMessage("Work finished!")
}
})

WorkManager ile birden fazla görevi bir chain oluşturarak yönetebilirsiniz.

WorkManager’ın durdurulması:

Önceden kuyruğa alınmış çalışmanızın artık çalışması gerekmiyorsa, iptal edilmesini isteyebilirsiniz.

WorkManager.cancelWorkById(workRequest.id)

Bu yazı içerisinde WorkManager’in ne olduğundan ve basit bir şekilde projenizde nasıl kullanabileceğinizden bahsettim. FirebaseJobDispatcher Nisan 2020'de, GCMNetworkManager Kasım 2020'de arşivlenicek. Bunun için projenizi WorkManager ile migrate etmeniz sizin açınızdan faydalı olacaktır. Migrate işlemi için buraya link bırakıyorum. Umarım faydalı bir yazı olmuştur, bir sonrakinde görüşmek üzere.

--

--