WorkManager, birden fazla bağımlı görevi belirten ve bu görevlerin hangi sırada çalıştırılacağını tanımlayan bir çalışma zinciri oluşturup sıraya almanıza olanak tanır. Bu işlev, özellikle belirli bir sırayla birden fazla görevi çalıştırmanız gerektiğinde yararlıdır.
Bir iş zinciri oluşturmak için WorkManager.beginWith(OneTimeWorkRequest)
veya WorkManager.beginWith(List<OneTimeWorkRequest>)
işlevini kullanabilirsiniz. Bu işlevler, her biri WorkContinuation
örneği döndürür.
Ardından, then(OneTimeWorkRequest)
veya then(List<OneTimeWorkRequest>)
kullanılarak bağımlı OneTimeWorkRequest
örnekleri eklemek için bir WorkContinuation
kullanılabilir.
WorkContinuation.then(...)
her çağrıldığında WorkContinuation
yeni bir örneği döndürülür. OneTimeWorkRequest
örneğinin List
'ünü eklerseniz bu istekler paralel olarak çalışabilir.
Son olarak, WorkContinuation
zincirinizi enqueue()
etmek için WorkContinuation.enqueue()
yöntemini kullanabilirsiniz.
Bir örnekle açıklayalım. Bu örnekte, 3 farklı Worker işi çalıştırılmak üzere (potansiyel olarak paralel olarak) yapılandırılmıştır. 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 işleyicisine iletilir. Yükleme işleyici, 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ştirmeleri
OneTimeWorkRequest
örneklerini zincirlediğinizde, üst iş isteklerinin çıkışı alt öğelere giriş olarak iletilir. Dolayısıyla yukarıdaki örnekte plantName1
, plantName2
ve plantName3
işlevlerinin çıkışları cache
isteğine giriş 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 ayarlanmış 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
sınıfını alt sınıflandırarak kendi sınıfınızı yazabilirsiniz.
OverwritingInputMerger
OverwritingInputMerger
, varsayılan birleştirme yöntemidir. Birleştirme işleminde anahtar çakışması varsa bir anahtar için en son değer, elde edilen çıkış verilerindeki önceki tüm sürümlerin üzerine yazılır.
Örneğin, tesis girişlerinin her birinin ilgili 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 işlemi tamamlayan son işleyici "kazanır" ve değeri cache
değerine iletilir.
İş istekleriniz paralel olarak çalıştırıldığı için çalıştırılma sırası konusunda garanti verilmez. Yukarıdaki örnekte plantName1
, en son hangi değerin yazıldığına bağlı olarak "tulip"
veya "elm"
değerini tutabilir. Anahtar çakışması olasılığınız varsa ve bir birleştirme işleminde tüm çıkış verilerini korumanız gerekiyorsa ArrayCreatingInputMerger
daha iyi bir seçenek olabilir.
ArrayCreatingInputMerger
Yukarıdaki örnekte, tüm plantname çalışanlarının çıktılarını korumak istediğimizden ArrayCreatingInputMerger
kullanmamız gerekir.
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 bir anahtarı bir dizi ile eşleştirir. Anahtarların her biri benzersizse sonuç, tek öğeli diziler dizisi olur.
Anahtar çakışması varsa ilgili değerler bir dizi içinde gruplandırılır.
Zincirleme ve Çalışma Durumları
OneTimeWorkRequest
zincirleri, çalışmaları başarıyla tamamlandığı sürece (yani bir Result.success()
döndürdükleri 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 aşağı yönlü etkilere neden olur.
İlk OneTimeWorkRequest
, bir iş isteği zincirine eklendiğinde, bu ilk iş isteğinin çalışması tamamlanana kadar sonraki tüm iş istekleri engellenir.
Sıraya eklendikten ve tüm çalışma kısıtlamaları karşılandıktan sonra ilk çalışma isteği çalışmaya başlar. Çalışma, kök OneTimeWorkRequest
veya List<OneTimeWorkRequest>
'te başarıyla tamamlanırsa (yani bir Result.success()
döndürülürse) sonraki bağımlı çalışma isteği grubu sıraya eklenir.
Her iş isteği başarıyla tamamlandığı sürece, zincirdeki tüm işler tamamlanana kadar aynı kalıp iş isteği zincirinizin geri kalanına yayılır. Bu en basit ve genellikle tercih edilen durum olsa da hata durumlarının ele alınması da aynı derecede önemlidir.
Bir işleyici, iş isteğinizi işlerken hata oluştuğunda tanımladığınız geri çekilme politikasına göre bu isteği yeniden deneyebilirsiniz. Bir zincirin parçası olan bir isteğin yeniden denenmesi, yalnızca bu isteğin kendisine sağlanan giriş verileriyle yeniden deneneceği anlamına gelir. Paralel olarak çalışan işler bundan etkilenmez.
Özel yeniden deneme stratejileri tanımlama hakkında daha fazla bilgi için Yeniden deneme ve bekleme politikası başlıklı makaleyi inceleyin.
Bu yeniden deneme politikası tanımlanmamışsa veya tükenmişse ya da OneTimeWorkRequest
işlevinin Result.failure()
döndürdüğü bir duruma ulaşırsanız söz konusu iş isteği ve tüm bağımlı iş istekleri FAILED.
olarak işaretlenir.
OneTimeWorkRequest
iptal edildiğinde de aynı mantık geçerlidir. Bağımlı tüm çalışma istekleri de CANCELLED
olarak işaretlenir ve bu çalışmaların yürütülmesi engellenir.
Başarısız olan veya iptal edilen çalışma isteklerinin bulunduğu bir zincire daha fazla çalışma isteği eklerseniz yeni eklenen çalışma isteğinizin de sırasıyla FAILED
veya CANCELLED
olarak işaretleneceğini unutmayın. Mevcut bir zincirin çalışma süresini uzatmak istiyorsanız ExistingWorkPolicy bölümündeki APPEND_OR_REPLACE
bölümüne bakın.
Bağımlı iş istekleri, iş isteklerinin her zaman zamanında tamamlanmasını sağlamak için iş isteği zincirleri oluşturulurken yeniden deneme politikalarını tanımlamalıdır. Başarısız çalışma istekleri, eksik zincirlere ve/veya beklenmedik duruma neden olabilir.
Daha fazla bilgi için İşi İptal Etme ve Durdurma başlıklı makaleyi inceleyin.