Zincirleme iş

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.

Zincirdeki bir sonraki işe farklı çıktılar aktaran üç işin gösterildiği şema. Üç çıkışın hepsi farklı anahtarlara sahip olduğundan sonraki iş üç anahtar/değer çifti alır.

Çatışma varsa “kazanan” son çalışan kazanır ve cache işlevine geçirildi.

Çıkışları zincirdeki bir sonraki işe geçiren üç işin gösterildiği şema. Bu durumda, bu işlerden ikisi aynı anahtara sahip çıkışlar üretir. Sonuç olarak, sonraki iş iki anahtar/değer çifti alır ve çakışan çıkışlardan biri atlanır.

Ç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.

Zincirdeki bir sonraki işe farklı çıkışlar aktaran üç işi gösteren şema. Sonraki işe, çıkış anahtarlarının her biri için bir tane olmak üzere üç dizi iletilir. Her dizi tek bir üyeye sahiptir.

Anahtar çakışması varsa ilgili değerler bir dizi halinde gruplandırılır.

Üç işin çıktıları zincirdeki bir sonraki işe ilettiğini gösteren şema. Bu durumda, bu işlerden ikisi aynı anahtara sahip çıkışlar üretir. Sonraki işe her anahtar için birer dizi iletilir. Bu anahtarla iki çıkış olduğu için bu dizilerden biri iki üyeye sahiptir.

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ı.

Bir iş zincirini gösteren şema. İlk iş sıraya alınır; Birbirini takip eden tüm işler, ilki bitene kadar 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 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.

Bir iş zincirini gösteren şema. İlk iş başarılı oldu ve bundan sonraki iki takipçi sıraya alındı. Kalan işler, önceki işlerin tamamlanmasını beklerken engellenir.

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.

Bir iş zincirini gösteren şema. Görevlerden biri başarısız oldu ancak geri yükleme politikası tanımlandı. Bu iş, uygun süre geçtikten sonra yeniden çalıştırılır. Bu iş başarıyla çalıştırılana kadar zincirdeki sonraki işler engellenir.

Ö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

Bir iş zincirini gösteren şema. Bir iş başarısız oldu ve tekrar denenemez. Sonuç olarak zincirde kendisinden sonra gelen tüm işler de başarısız olur.

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.

Bir iş zincirini gösteren şema. Bir iş iptal edildi. Sonuç olarak, zincirdeki sonraki tüm işler de iptal edilir.

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.