WorkManager ile Tanışın

Ali Osman Ay
Mobillium
Published in
4 min readJun 22, 2021

Öncelikle WorkManager’dan bahsetmek gerekirse; WorkManager belirli bir zamanda veya periyodik olarak asenkron görevleri cihaz kapalı bile olsa planlayıp uygulayabileceğimiz bir Jetpack öğesidir. Belli saatlerde veri tabanına bilgi girişi veya periyodik uzak sunucudan veri çekme gibi örneklerde kullanılabilir.

Peki bu kütüphane nasıl çalışır?

WorkManager en üst katman gibi davranır ve Api sürümüne göre Api23’ün üstünde JobScheduler kullanır altında ise yine sürüme göre cihazda Google Play Servisleri varsa GcmNetworkManager yoksa AlarmManager ve BroadcastReceiver kullanır.

Projeye eklemek

Projenin uygulama build.gradle dosyasına bağımlılık olarak eklenir.

Worker Sınıfı

Öncelikle Worker soyut sınıfından türeterek bir sınıf oluşturuyoruz (WorkManager ile gelen sınıfa dikkat ederek, Android içerisinde birden çok aynı isimde sınıf var). Bizden Context ve WorkerParams parametreleri istiyor, onları da ekliyoruz. Bu sınıfta yapmak istediğimiz işlemleri implement ettiğimiz doWork fonksiyonunda yazıyoruz. DoWork () işlevinden döndürülen sonuç, WorkManager hizmetine işin başarılı olup olmadığını ve başarısızlık durumunda işin yeniden denenip denenmeyeceğini bildirir.

Result.success (): İş başarıyla tamamlandı.

Result.failure (): Çalışma başarısız oldu.

Result.retry (): Çalışma başarısız oldu ve yeniden deneme politikasına göre başka bir zamanda denenmelidir.

Sınırlar(Constraints)

WorkManager’ın güzel kısımlarından birisi de sınırlar, isteğin çalışması için sınırlar koyabiliriz. Örneğin telefon şarja bağlıyken, belli bir süre sonra, internet bağlantısı varken vs.

Şu şekilde oluşturuyoruz;

Veri Gönderimi

Activity’den Worker sınıfına veya Worker sınıfından Activity’e veri gönderirken WorkManager ile gelen Data sınıfını kullanacağız.

SetInputData fonksiyonu ile isteğe data eklenebilir ve doWork fonksiyonu için de bu data getInputData ile alınabilir. Intentler ile benzer bir durum var.

Tek seferlik istek(OneTimeWorkRequest)

Builder yardımı ile bir oneTimeWorkRequest isteği oluşturduk, burada sınırları ve veriyi ekledik. Daha sonra oluşturduğumuz WorkManager’a gönderdik.

İsteğin bilgilerini liveData olarak gözlemleyebiliriz, bunun için oneTimeWorkRequest.id kullanabiliriz. (İsteği oluştururken vereceğiniz tag ile de gözlemleme yapılabiliyor). Bu isteğin dört tane durumu var. Burada it.state.name ile durumlarını yazdırdık ve bittiğinde Worker sınıfında Result ile gönderdiğimiz değeri Toast ile ekrana bastık.

Periyodik İstekler

Belirli zaman aralıklarıyla yapılması gereken durumlarda bu istek kullanılabilir.

Başarılı ve başarısız durumlar yalnızca tek seferlik ve zincirleme işler için geçerlidir. Periyodik çalışma için sadece bir terminal durumu vardır, Cancelled. Bunun nedeni, periyodik çalışmanın asla bitmemesidir. Her çalıştırmadan sonra, sonuca bakılmaksızın yeniden planlanır.

Bu istek için kullanacağımız sınıf bu olsun.

Bu şekilde isteği oluşturduk, tabii veri ve sınırlar buna da eklenebilir aynı tek seferlik istekte olduğu gibi.

Zincirleme İstekler

Bir defa çalışan isteklerden arka arkaya olacak şekilde istek zincirleri oluşturabiliriz. Zincirleme durumlarda bir öncekinin veri çıktısı sonrakine girdi olarak gelir.

Buradaki gibi iki ayrı OneTimeWorkRequest kullanılabileceği gibi OneTimeWorkRequest’lerden oluşan bir liste de kullanılabilir.

Birden çok üst öğeden gelen girdileri yönetmek için WorkManager, InputMerger’ı kullanır. İki farklı InputMerger bize sağlar.

OverwritingInputMerger: Tüm anahtarları çıkışa eklemeye çalışır bir çakışma durumunda üzerine yazar. Default olarak bu ile gelir.

ArrayCreatingInputMerger: Girdileri birleştirmeye çalışır, gerektiğinde diziler oluşturur.

OverwritingInputMerger

ArrayCreatingInputMerger

Zincir İstek Durumları şu şekilde;

İlk OneTimeWorkRequest bir iş istekleri zincirinde sıraya konulduğunda, bu ilk iş isteğinin çalışması tamamlanana kadar sonraki tüm iş istekleri engellenir. (Ayrıca burada paralel çalışan istekler var)

Bir hata meydana gelirse, bu isteği tanımladığınız geri çekilme ilkesine göre yeniden deneyebilirsiniz.

Bir sonraki yazımızda görüşmek üzere,

İyi kodlamalar…

Kaynaklar:

https://developer.android.com/topic/libraries/architecture/workmanager/basics

--

--