WorkManager, sizin sorumluluğunuzda olan belirli bir iş parçacığının ve bunların hangi sırayla yürütülmesi gerektiğini tanımlar. 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
örnekten List
tanesini 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ı Ç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 birleştirilir ve bir önbelleğe alma çalışanı işine aktarılı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
ö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
.
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 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 alt sınıflandırma yaparak kendi kullanım alanınızı yazabilirsiniz.
InputMerger
OverwritingInputMerger
OverwritingInputMerger
, varsayılan birleştirme yöntemidir. Birleştirme işleminde anahtar çakışması varsa bir anahtarın son değeri, 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.
Ç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
, en son hangi değerin yazıldığına bağlı olarak "tulip"
veya "elm"
değerini tutabilir. Ö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 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 anahtarı bir dizi ile eşler. Anahtarların her biri benzersizse sonuç, tek öğeli diziler dizisi olur.
Anahtar çakışması varsa ilgili değerler bir dizi halinde 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ş 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 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 ç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. Zincirin bir 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 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. 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 isteklerine 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. Ç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 İşi İptal Etme ve Durdurma başlıklı makaleyi inceleyin.