WorkManager, her bir iş için çalışan bir iş parçacığının nasıl ve bunların hangi sırayla yürütülmesi gerektiğini tanımlar. Bu işlevi, özellikle tek bir seferde birkaç görevi çalıştırmanız gerektiğinde yardımcı olur.
Bir iş zinciri oluşturmak için
WorkManager.beginWith(OneTimeWorkRequest)
veya
WorkManager.beginWith(List<OneTimeWorkRequest>)
her biri
WorkContinuation
.
WorkContinuation
, daha sonra bağımlı OneTimeWorkRequest
eklemek için kullanılabilir.
kullanan örnekler
then(OneTimeWorkRequest)
veya
then(List<OneTimeWorkRequest>)
,
Her WorkContinuation.then(...)
çağrısı, yeni bir WorkContinuation
örneği döndürür. OneTimeWorkRequest
örnekten List
tanesini eklerseniz bu istekler paralel olarak çalışabilir.
Son olarak,
WorkContinuation.enqueue()
yöntemini WorkContinuation
'lık zincirinize enqueue()
olarak ayarlayın.
Bir örnekle açıklayalım. Bu örnekte 3 farklı Çalışan işi vardır çalışacak şekilde yapılandırılandır (paralel olarak olabilir). Bu Çalışanların sonuçları daha sonra önbelleğe alınmış ve önbelleğe alınmış bir Çalışan işine aktarılmıştır. Son olarak, bunun çıktısı iş, sonuçları uzaktan kumandaya yükleyen bir yükleme Çalışanına aktarılır sunucu.
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
örnek zincirini bağladığınızda, üst çalışmanın çıkışı
istekleri, alt öğelere girdi olarak iletilir. Yukarıdaki örnekte
plantName1
, plantName2
ve plantName3
çıkışları,
cache
isteğine girdi.
WorkManager, birden fazla üst iş isteğinden gelen girişleri yönetmek için
InputMerger
.
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. Anlaşmazlık durumunda önceden ayarlanmış anahtarların üzerine yazılır.ArrayCreatingInputMerger
girişleri birleştirmeye çalışır ve gerektiğinde dizi oluşturur.
Daha spesifik bir kullanım alanınız varsa alt sınıflandırma yaparak kendi kullanım alanınızı yazabilirsiniz.
InputMerger
Üzerine YazmaInputMerger
OverwritingInputMerger
, varsayılan birleştirme yöntemidir. Önemli bir konu
birleşimde çakışma varsa, bir anahtarın en son değeri
çıkarmanıza yardımcı olur.
Örneğin, bitki girişlerinin her birinin kendi
değişken adlarını ("plantName1"
, "plantName2"
ve "plantName3"
) kullanıyorsanız
cache
çalışanına iletilen verilerin üç anahtar/değer çifti olur.
Çatışma varsa “kazanan” son çalışan kazanır ve
cache
işlevine geçirildi.
Çalışma istekleriniz paralel olarak yürütüldüğünden,
çalışma sırasına göre düzenleyebilirsiniz. Yukarıdaki örnekte, plantName1
bir
yazıldığı değere bağlı olarak "tulip"
veya "elm"
değerine ayarlanır
bakın. Önemli bir çakışma olasılığınız varsa ve tüm çıktıları korumanız gerekiyorsa
veri birleştirmesi söz konusu değilse ArrayCreatingInputMerger
daha iyi bir seçenek olabilir.
DiziOluşturmaGiriş Birleştirme
Yukarıdaki örnekte, tüm bitkilerden elde edilen sonuçları korumak istediğimiz
belirtmek gerekirse ArrayCreatingInputMerger
kullanmalıyız.
Kotlin
val cache: OneTimeWorkRequest = OneTimeWorkRequestBuilderP<lantWorker(>) .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şler. Anahtarların her biri
benzersizse, sonucunuz tek öğeli bir dizidir.
Herhangi bir temel çakışma varsa bunlara karşılık gelen değerler gruplandırılır oluşturmaktır.
Zincirleme ve Çalışma Durumları
OneTimeWorkRequest
zincirleri, çalışmaları devam ettiği sürece sıralı olarak yürütülür
işlemi başarıyla tamamlanır (yani, Result.success()
döndürür). İş
istekler çalışırken başarısız olabilir veya iptal edilebilir. Bu durum,
isteğe bağlıdır.
İlk OneTimeWorkRequest
bir iş istekleri zincirine eklendiğinde,
o ilk çalışmanın çalışmasına kadar sonraki tüm iş istekleri engellenir.
tamamlandı.
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 başarıyla tamamlanmışsa
OneTimeWorkRequest
veya List<OneTimeWorkRequest>
(yani, bir
Result.success()
), bir sonraki bağımlı iş isteği grubu şu şekilde olacaktır:
sıraya alındı.
Her iş isteği başarılı bir şekilde tamamlandığı sürece, iş istekleri zincirinin geri kalanına, iş istekleri zincirindeki tüm çalışmalara kadar gerektiğini varsayalım. En basit ve tercih edilen durum bu olsa da ele alınması da aynı derecede önem taşır.
Bir çalışan iş isteğinizi işlerken bir hata oluştuğunda şunları yapabilirsiniz: geri alma politikasına göre bu isteği tekrar tanım. Bir zincirin parçası olan bir isteği yeniden denemek, sadece bu isteğin sağlanan giriş verileriyle yeniden denenmelidir. Birbirine paralel olarak yürütülen çalışmalar etkilenmez.
Özel yeniden deneme stratejilerini tanımlama hakkında daha fazla bilgi için Yeniden Deneme ve Geri Alma Politika.
Bu yeniden deneme politikası tanımlanmamışsa veya tükendiyse ya da başka bir şekilde
OneTimeWorkRequest
değeri Result.failure()
değerini döndürürse bu durum
iş isteği ve tüm bağımlı iş istekleri FAILED.
olarak işaretlenir
OneTimeWorkRequest
iptal edildiğinde de aynı mantık geçerlidir. Herhangi bir bağımlı
iş istekleri de CANCELLED
olarak işaretlenir ve çalışmaları yürütülmez.
Başarısız olan ya da başarısız olan bir zincire daha fazla iş isteği eklemeniz durumunda
kullanıcı iş isteklerini iptal ettiyse, yeni eklenen iş isteğiniz de
sırasıyla FAILED
veya CANCELLED
olarak işaretlendi. Çalışmayı uzatmak
mevcut bir zincire göre düzenlenmiştir; bkz. APPEND_OR_REPLACE
Mevcut WorkPolicy.
İş istekleri zincirleri oluşturulurken bağımlı iş istekleri tanımlanmalıdır. işlerin her zaman zamanında tamamlandığından emin olmak için politikaları yeniden deneme Başarısız iş istekleri, zincirlerin tamamlanmamasına ve/veya beklenmeyen bir duruma yol açabilir.
Daha fazla bilgi için İptal Etme ve Durdurma İş.