- 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.
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
Java
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.
Ş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.
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.
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 )
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.
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")
}
})
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: