WorkManager Nedir?

Ego1st

Uzman üye
15 Mar 2018
1,109
25
WorkManager Nedir?

WorkManager, ertelenebilir ve asenkronize işlemleri programlamak için kullanılan bir API'dır. WorkManager işlemlerine uygulama kapansa ya da cihaz yeniden başlatılsa da kaldığı yerden devam eder. Çoğu Android teknolojisinde de olduğu gibi WorkManager Android Jetpack'in içerisindedir. WorkManager, bütün eski iş programlama API'larına (Firebase Job Dispatcher, Gcm Network Manager ve Job Scheduler) tercih edilebilir. WorkManager API 14'ten bu yana gelen yeni özellikler ve prosedürler ile uyumlu bir şekilde çalışabilir.

WorkManager'ın iş programlamada kullanılan yapısı şu şekildedir.

overview-criteria.png


Yenilikler

İş Sınırları;

Bir iş için gereken sınırları belirlemek için kullanılır. Örnek olarak; Eğer cihazın şarjı %50'nin altında ise internetten verileri indir şeklinde. İş Sınırları bu şekilde bi işin hangi şartlar altında gerçekleşeceğini belirtmemize yarar.

İş Zincirleme;

Kompleks ve karışık işler yerine, bütün işleri birbirine zincirleyerek arkaplanda da bir akış oluşturabilirsiniz. Örnek olarak; İlk olarak internetten verileri indir, daha sonra bildirimleri kontrol et daha sonra güncel konumu al şeklinde zincirleme yapabilirsiniz. İş zincirleme yine çokça kullanılan bir özelliktir.

İş Planlama Örneği:

Kotlin

Kod:
WorkManager.getInstance(...)
    .beginWith(listOf(workA,workB))
    .then(workC)
    .enqueue()

Java

Kod:
WorkManager.getInstance(...)
    .beginWith(Arrays.asList(workA, workB))
    .then(workC)
    .enqueue();

Gördüğünüz gibi çok büyük farklılıklar bulunmamaktadır.

Esnek Yeniden Deneme Prosedürü;

Bazen planladığımız işler tamamlanamaz veya hata alır, bunun karşısında WorkManager'ın bir hata dinleyicisi vardır, sizin kodlamanıza gerek duymadan bir iş hata ile sonuçlandığında onu belli bir süre geçtikten sonra tekrar çalıştırır.

Güçlü İş Planlama Yapısı;

WorkManager, bir işin tek zamanlı mı ya da bir programa uyarak mı tekrarlanacağını belirlemenizi sağlar. WorkManager ile işlere isim atayabilir ve onları gruplandırabilir ve planlama yapabilirsiniz. Planlanmış işler lokal bir veritabanında tutulur ve WorkManager, cihazın yeniden başlatılması gibi durumlarda bu veritabanıyla ilgilenir.

Entegre Yapısı;

WorkManager RxJava ve Coroutines gibi asenkronize API'larla entegre bir yapıdadır ve kendi asenkronize API'larınızla da sorunsuz ve sıkıntısız bir şekilde çalışabilir. Ek olarak WorkManager hem çok acil hem de ertelenebilir işlerle çalışabilir. Acil işler uygulama kapansa ya da cihaz yeniden başlarsa bile devamlılığını sürdürür.

Örnek olarak;

Backend servislerine log ve veriler göndermek
Periyodik olarak app'i sunucuyla senkronize etmek.

WorkManager, uygulama kapandığında yok edilebilecek işlemler için geliştirilmemiştir. Daha çok arkaplan işlemleriyle alakalıdır.

Şimdi Kotlin için WorkManager örneği yapalım

Bu örnekte her 15 dakikada bir veritabanımızdaki sayıyı 1 arttıracağız

Öncelikle WorkManager'ı projemize dahil edelim. build.gradle -> dependencies altına bunları yapıştıralım.

Kod:
dependencies {
  def work_version = "2.4.0"

    implementation "androidx.work:work-runtime-ktx:$work_version"
}

Şimdi arkaplan işlemimizi yapacak olan bir sınıf oluşturuyoruz, örneğimizde bu *******Database olacak.

ve Worker sınıfını extend ediyoruz yani şu şekilde olacak

class *******Database(val context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {}

bu şekilde yazdıktan sonra bizden implement etmemizi istediği bir fonksiyon olaca bu doWork, doWork'ün içinde olan herşey periyodik veya tek zamanlı olarak gerçekleşecek.

Kod:
val getData = inputData
        val myNumber = getData.getInt("key", 0)

        *******Database(myNumber)
        return Result.success()

*******Database içinde

private fun *******Database (myNumber: Int) {
        val sharedPreferences = context.getSharedPreferences("com.ego1st.kotlinworkmanager", Context.MODE_PRIVATE)
        var savedNumber = sharedPreferences.getInt("number1", 0)
        savedNumber += myNumber
        println(savedNumber)
        sharedPreferences.edit().putInt("number1", savedNumber).apply()

    }

yazıyoruz burada kısaca numaramızı bir arttırıyoruz, bu şekilde yapısal bir biçimde WorkManager sistemimizi kurduk şimdi MainActivity'e gelelim.

Burada sınıfın içinde context ve workerparams almamızın sebebi extend ettiğimiz worker sınıfının bunları istemesi. Ve bu data nereden geliyor diye merak etmeyin onu MainActivity'de gönderiyoruz.

Yukarıda context.getSharedPreferences("com.ego1st.kotlinworkmanager", Context.MODE_PRIVATE) yazısında com.ego1st.kotlinworkmanager yerine kendi package name'inizi yazmalısınız. Yoksa veriler kaydolmaz.

Kod:
val data = Data.Builder().putInt("key", 1).build()

        val constraints = Constraints.Builder()
            .setRequiresCharging(false)
            .build()

        val request1: PeriodicWorkRequest = PeriodicWorkRequestBuilder<*******Database>(15, TimeUnit.MINUTES)
            .setConstraints(constraints)
            .setInputData(data)
            .build()

        WorkManager.getInstance(this).enqueue(request1)

        WorkManager.getInstance(this).getWorkInfoByIdLiveData(request1.id).observe(this, Observer {

            when (it.state) {
                WorkInfo.State.RUNNING -> println("Çalışıyor")
                WorkInfo.State.FAILED -> println("Başarısız oldu")
                WorkInfo.State.SUCCEEDED -> println("Başarılı oldu")
            }
        })
Diğer tarafta alınacak olan datayı DataBuilder ile koyduk, ismi key ve değeri 1 daha sonrasında build dedik.

Daha sonra yukarıda bashetmiş olduğum sınırları belirledik. Cihazın şarjda olmaması gerekiyor bu örnekte.

Daha sonra bir Periyodik İş İsteği verdik ve ******* Database dedik, daha sonra her 15 dakikada bir gerçekleşmesi gerektiğini belirttik. Constarinti ve datayı koyduk ardından build dedik.

Daha sonra işi sıraya aldık.

Daha sonra bir observer koyduk bu sayede daha önceden request1 olarak belirlediğimiz işin durumunu öğrendik ve yazdırdık. WorkManager ile ilgili paylaşabileceklerim bunlar.

Bazı Notlar;

- WorkManager'ın her zaman son sürümünü kullanmaya çalışın. Sürekli gelişen bir yapısı olduğunda size faydası olacaktır.

- WorkManager kullanırken çok dikkatlı olmak zorundasınız çünkü pek iyi bir kurtarma sistemine sahip değil, yazdığınız bütün işlemleri iki kez gözden geçirin.

- WorkManager Java'dan ziyade Kotlin ile daha iyi çalışmaktadır eğer WorkManager kullanmak istiyorsanız Kotlin sizin 1. tercihiniz olmalıdır.

- WorkManager ile Coroutines kütüphanesi %100 senkron bir şekilde çalışmaktadır, ikisini de projenizde bulundurmak size avantaj sağlar

NOT: Sansürlenmiş / gizlenmiş yerde R efresh yazıyo dostlar :))
 
Son düzenleme:

Haykoo

Yeni üye
28 Şub 2012
5
0
Güzel bir konu fakat sıkıntılı durumları da var bu yapının.
Örneğin bir bildirimi WorkManager ile planladığınız zamanını periodicworkmanager belli bir süre sonra zamanı kaydırarak sizin belirlediğiniz zamanın dışında çalıştırabiliyor, aksatıyor. Bunu da sanırım telefonun pil ömrüne olan sadakatinden dolayı yapıyor diye tahmin ediyorum :) Çok stabil olduğunu düşünmüyorum, en azından geliştirmesi gerekiyor diye düşünüyorum Google tarafından.
AlarmManager'ın kaldırılması durumundan dolayı yeni ve sürdürülebilir bir yapı olduğu için WorkManager kullanmaya devam ediyoruz tabi.


Emeğinize sağlık :)
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.