WorkManager, birden fazla bağımlı görev belirten ve bunların hangi sırayla çalışmaları gerektiğini tanımlayan bir iş zinciri oluşturup sıraya koymanıza olanak tanır. Bu işlev, birkaç görevi belirli bir sırayla çalıştırmanız gerektiğinde özellikle kullanışlıdır.
İş zinciri oluşturmak için her biri WorkContinuation
örneği döndüren WorkManager.beginWith(OneTimeWorkRequest)
veya WorkManager.beginWith(List<OneTimeWorkRequest>)
kullanabilirsiniz.
Ardından WorkContinuation
, then(OneTimeWorkRequest)
veya then(List<OneTimeWorkRequest>)
ile bağımlı OneTimeWorkRequest
örnekleri eklemek için kullanılabilir.
WorkContinuation.then(...)
her çağrıldığında yeni bir WorkContinuation
örneği döndürülür. OneTimeWorkRequest
örnekten List
tanesini eklerseniz bu istekler potansiyel olarak paralel çalışabilir.
Son olarak, WorkContinuation
zincirinizi enqueue()
için WorkContinuation.enqueue()
yöntemini kullanabilirsiniz.
Bir örnekle açıklayalım. Bu örnekte, 3 farklı Çalışan işi çalışacak şekilde yapılandırılmıştır (muhtemelen paralel olarak). Bu Çalışanların sonuçları daha sonra birleştirilir ve bir önbelleğe alma Çalışanı işine aktarılır. Son olarak, bu işin çıkışı bir yükleme çalışanına iletilir. Bu çalışan, sonuçları uzak bir sunucuya yükler.
Kotlin
WorkManager.getInstance(myContext) // Candidates to run in parallel .beginWith(listOf(plantName1, plantName2, plantName3)) // Dependent work (only runs after all previous work in chain) .then(cache) .then(upload) // Call enqueue to kick things off .enqueue()
Java
WorkManager.getInstance(myContext) // Candidates to run in parallel .beginWith(Arrays.asList(plantName1, plantName2, plantName3)) // Dependent work (only runs after all previous work in chain) .then(cache) .then(upload) // Call enqueue to kick things off .enqueue();
Giriş Birleştiriciler
OneTimeWorkRequest
örneklerini zincirlediğinizde, üst çalışma isteklerinin çıkışı alt öğelere giriş olarak iletilir. Dolayısıyla yukarıdaki örnekte plantName1
, plantName2
ve plantName3
çıktıları cache
isteğine girdi olarak aktarılır.
WorkManager, birden fazla üst iş isteğindeki girişleri yönetmek için InputMerger
özelliğini kullanır.
WorkManager tarafından sağlanan iki farklı InputMerger
türü vardır:
OverwritingInputMerger
, tüm girişlerdeki tüm tuşları çıkışa eklemeye çalışır. Çakışma olması halinde önceden ayarlanan anahtarların üzerine yazılır.ArrayCreatingInputMerger
, gerektiğinde dizi oluşturarak girişleri birleştirmeye çalışır.
Daha spesifik bir kullanım alanınız varsa InputMerger
alt sınıfını kullanarak kendi senaryonuzu yazabilirsiniz.
Üzerine Yazarak GirdiBirleştirme
OverwritingInputMerger
varsayılan birleştirme yöntemidir. Birleştirme işleminde anahtar çakışmaları varsa bir anahtarın son değeri, sonuçta elde edilen çıkış verilerinde önceki sürümlerin üzerine yazılır.
Örneğin, bitki girişlerinin her birinde ilgili değişken adlarıyla ("plantName1"
, "plantName2"
ve "plantName3"
) eşleşen bir anahtar varsa cache
çalışanına iletilen veriler üç anahtar/değer çiftine sahip olur.
Çakışma olması halinde "kazanır" işlemini tamamlayan son çalışan, değeri cache
adlı CSS'ye iletilir.
İş istekleriniz birbirine paralel olarak yapıldığından, işlerin hangi sırayla gerçekleştirileceği konusunda bir garantiniz yoktur. Yukarıdaki örnekte plantName1
, en son hangi değerin yazıldığına bağlı olarak "tulip"
veya "elm"
değerini alabilir. Önemli bir çakışma ihtimaliniz varsa ve bir birleştirmede tüm çıkış verilerini korumanız gerekiyorsa ArrayCreatingInputMerger
daha iyi bir seçenek olabilir.
ArrayOluşturan GirintiBirleştirme
Yukarıdaki örnekte, tüm bitki isimlerinin çalışanlarından elde edilen çıktıları korumak istediğimizi düşünerek ArrayCreatingInputMerger
kullanmalıyız.
Kotlin
val cache: OneTimeWorkRequest = OneTimeWorkRequestBuilder<PlantWorker>() .setInputMerger(ArrayCreatingInputMerger::class) .setConstraints(constraints) .build()
Java
OneTimeWorkRequest cache = new OneTimeWorkRequest.Builder(PlantWorker.class) .setInputMerger(ArrayCreatingInputMerger.class) .setConstraints(constraints) .build();
ArrayCreatingInputMerger
her anahtarı bir diziyle eşleştirir. Anahtarların her biri benzersizse sonucunuz tek öğeli bir dizi olur.
Herhangi bir anahtar çakışması varsa karşılık gelen değerler bir dizide birlikte gruplandırılır.
Zincir Bağlantı ve Çalışma Durumları
OneTimeWorkRequest
zincirleri, çalışmaları başarıyla tamamlandığı (yani bir Result.success()
döndürdüğü) sürece sırayla yürütülür. İş istekleri çalışırken başarısız olabilir veya iptal edilebilir. Bu durum, bağımlı iş istekleri üzerinde aşağı yönlü etkilere yol açar.
İlk OneTimeWorkRequest
iş istekleri zincirinde sıraya alındığında, bu ilk iş isteğinin çalışması tamamlanana kadar sonraki tüm iş istekleri engellenir.
Sıraya girdikten ve tüm iş kısıtlamaları karşılandıktan sonra ilk iş isteği çalışmaya başlar. İş, kök OneTimeWorkRequest
veya List<OneTimeWorkRequest>
kök dizininde başarıyla tamamlanırsa (yani bir Result.success()
döndürür) sonraki bağımlı iş istekleri grubu sıraya alınır.
Her bir iş isteği başarıyla tamamlandığı sürece bu kalıp, zincirdeki tüm işler tamamlanana kadar iş istekleri zincirinizin geri kalanında da yayılır. Bu, en basit ve genellikle tercih edilen durum olsa da, hata durumlarının ele alınması da bir o kadar önemlidir.
Bir çalışan, çalışma isteğinizi işlerken hata oluşursa bu isteği tanımladığınız bir geri yükleme politikasına göre yeniden deneyebilirsiniz. Bir zincirin parçası olan bir isteğin yeniden denenmesi, sadece o isteğin kendisine sağlanan giriş verileriyle yeniden deneneceği anlamına gelir. Paralel olarak çalışan çalışmalar bu durumdan etkilenmeyecek.
Özel yeniden deneme stratejileri tanımlama hakkında daha fazla bilgi için Yeniden Deneme ve Geri Yükleme Politikası bölümüne bakın.
Bu yeniden deneme politikası tanımlanmamışsa veya tükenmişse ya da OneTimeWorkRequest
öğesinin Result.failure()
değerini döndürdüğü bir duruma erişirseniz bu iş isteği ve bağımlı tüm iş istekleri FAILED.
olarak işaretlenir
OneTimeWorkRequest
iptal edildiğinde de aynı mantık geçerlidir. Bağımlı iş istekleri de CANCELLED
olarak işaretlenir ve bunların çalışmaları yürütülmez.
Başarısız olan veya iptal edilmiş iş istekleri olan bir zincire daha fazla iş isteği eklerseniz yeni eklenen çalışma isteğiniz de sırasıyla FAILED
veya CANCELLED
olarak işaretlenir. Mevcut bir zincirin çalışmasını genişletmek istiyorsanız MevcutWorkPolicy'de APPEND_OR_REPLACE
bölümüne bakın.
İş istekleri zincirleri oluşturulurken bağımlı iş istekleri, işlerin her zaman zamanında tamamlanmasını sağlamak için yeniden deneme politikaları tanımlamalıdır. Başarısız olan iş istekleri, eksik zincirlere ve/veya beklenmedik durumla sonuçlanabilir.
Daha fazla bilgi için İşi İptal Etme ve Durdurma bölümünü inceleyin.