WorkManager, birden fazla bağımlı görevi belirten ve hangi sırada çalıştırılmaları gerektiğini tanımlayan bir çalışma zinciri oluşturup sıraya almanıza olanak tanır. Bu işlev, özellikle belirli bir sırada birkaç görev çalıştırmanız gerektiğinde yararlıdır.
Bir çalışma zinciri oluşturmak için WorkManager.beginWith(OneTimeWorkRequest)
veya WorkManager.beginWith(List<OneTimeWorkRequest>)
kullanabilirsiniz. Bunların her biri WorkContinuation
örneğini döndürür.
Daha sonra then(OneTimeWorkRequest)
veya then(List<OneTimeWorkRequest>)
kullanılarak bağımlı OneTimeWorkRequest
örnekleri eklemek için WorkContinuation
kullanılabilir.
WorkContinuation.then(...)
işlevinin her çağrılması, WorkContinuation
işlevinin yeni bir örneğini döndürür. List
örneği OneTimeWorkRequest
eklerseniz bu istekler potansiyel olarak paralel çalışabilir.
Son olarak, WorkContinuation
zincirinizi enqueue()
için WorkContinuation.enqueue()
yöntemini kullanabilirsiniz.
Bir örneğe göz atalım. Bu örnekte, 3 farklı Worker işinin (potansiyel olarak paralel) çalışacak şekilde yapılandırıldığı varsayılmaktadır. Bu çalışanların sonuçları daha sonra birleştirilir ve önbelleğe alma çalışanı işine aktarılır. Son olarak, bu işin çıkışı, sonuçları uzak bir sunucuya yükleyen bir yükleme işçisine iletilir.
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ştiricileri
OneTimeWorkRequest
örneklerini zincirlediğinizde üst iş isteklerinin çıkışı, alt öğelere giriş olarak iletilir. Bu nedenle, yukarıdaki örnekte plantName1
, plantName2
ve plantName3
çıkışları, cache
isteğinin girişleri olarak iletilir.
WorkManager, birden fazla üst iş isteğinden gelen girişleri yönetmek için InputMerger
kullanır.
WorkManager tarafından sağlanan iki farklı InputMerger
türü vardır:
OverwritingInputMerger
Tüm girişlerdeki tüm anahtarları çıkışa eklemeye çalışır. Çakışma olması durumunda, daha önce ayarlanan anahtarların üzerine yazılır.ArrayCreatingInputMerger
girişleri birleştirmeye çalışır ve gerektiğinde diziler oluşturur.
Daha spesifik bir kullanım alanınız varsa InputMerger
alt sınıfını oluşturarak kendi kullanım alanınızı yazabilirsiniz.
OverwritingInputMerger
OverwritingInputMerger
, varsayılan birleştirme yöntemidir. Birleştirme işleminde anahtar çakışmaları varsa bir anahtarın en son değeri, sonuçtaki çıkış verilerinde önceki tüm sürümlerin üzerine yazılır.
Örneğin, tesis girişlerinin her birinde kendi değişken adlarıyla ("plantName1"
, "plantName2"
ve "plantName3"
) eşleşen bir anahtar varsa cache
çalışanına iletilen verilerde üç anahtar-değer çifti bulunur.
Çakışma varsa "kazanan" son çalışan olur ve değeri cache
'ya aktarılır.
Çalışma istekleriniz paralel olarak çalıştırıldığından, hangi sırayla çalıştırılacağı garanti edilmez. Yukarıdaki örnekte, hangi değerin en son yazıldığına bağlı olarak plantName1
, "tulip"
veya "elm"
değerini içerebilir. Anahtar çakışması ihtimali varsa ve birleştirme işleminde tüm çıkış verilerini korumanız gerekiyorsa ArrayCreatingInputMerger
daha iyi bir seçenek olabilir.
ArrayCreatingInputMerger
Yukarıdaki örnekte, tüm tesis adı çalışanlarının çıkışlarını korumak istediğimiz için 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 dizilerden oluşan bir seri olur.
Anahtar çakışması varsa ilgili değerler bir dizide birlikte gruplandırılır.
Zincirleme ve Çalışma Durumları
OneTimeWorkRequest
zincirleri, çalışmaları başarıyla tamamlandığı (yani Result.success()
döndürdüğü) sürece sırayla yürütülür. Çalışma istekleri, çalışırken başarısız olabilir veya iptal edilebilir. Bu durum, bağımlı çalışma istekleri üzerinde etkiler yaratır.
Bir iş isteği zincirinde ilk OneTimeWorkRequest
sıraya alındığında, bu ilk iş isteğinin işi tamamlanana kadar sonraki tüm iş istekleri engellenir.
Sıraya alındıktan ve tüm çalışma kısıtlamaları karşılandıktan sonra ilk iş isteği çalışmaya başlar. Çalışma kök dizinde OneTimeWorkRequest
veya List<OneTimeWorkRequest>
başarılı bir şekilde tamamlanırsa (yani Result.success()
döndürürse) bağımlı çalışma isteklerinin bir sonraki grubu sıraya alınır.
Her iş isteği başarıyla tamamlandığı sürece bu aynı kalıp, zincirdeki tüm işler tamamlanana kadar iş isteği zincirinizin geri kalanına yayılır. Bu en basit ve genellikle tercih edilen durum olsa da hata durumlarının da ele alınması gerekir.
Bir çalışan, iş isteğinizi işlerken hata oluşursa tanımladığınız bir geri çekilme politikasına göre isteği yeniden deneyebilirsiniz. Bir zincirin parçası olan bir isteği yeniden denemek, yalnızca bu isteğin kendisine sağlanan giriş verileriyle yeniden deneneceği anlamına gelir. Paralel olarak çalışan işlemler etkilenmez.
Özel yeniden deneme stratejileri tanımlama hakkında daha fazla bilgi için Yeniden Deneme ve Geri Çekilme Politikası başlıklı makaleyi inceleyin.
Yeniden deneme politikası tanımlanmamışsa veya tükenmişse ya da OneTimeWorkRequest
'nın Result.failure()
döndürdüğü bir duruma ulaşırsanız bu çalışma isteği ve tüm bağımlı çalışma istekleri FAILED.
olarak işaretlenir.
Aynı mantık, OneTimeWorkRequest
iptal edildiğinde de geçerlidir. Bağımlı iş istekleri de CANCELLED
olarak işaretlenir ve bu işler yürütülmez.
Başarısız olan veya iş isteklerinin iptal edildiği bir zincire daha fazla iş isteği eklerseniz yeni eklenen iş isteğinizin de sırasıyla FAILED
veya CANCELLED
olarak işaretleneceğini unutmayın. Mevcut bir zincirin çalışmasını genişletmek istiyorsanız APPEND_OR_REPLACE
bölümüne bakın. ExistingWorkPolicy.
İş isteği zincirleri oluştururken, işin her zaman zamanında tamamlanmasını sağlamak için bağımlı iş isteklerinde yeniden deneme politikaları tanımlanmalıdır. Başarısız olan iş istekleri, eksik zincirlere ve/veya beklenmedik durumlara neden olabilir.
Daha fazla bilgi için Çalışmayı İptal Etme ve Durdurma başlıklı makaleyi inceleyin.