Zincirleme iş

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.

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ş, çakışan çıkışlardan biri atlanmış iki anahtar/değer çifti alır.

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

Zincirdeki bir sonraki işe farklı çıktılar aktaran üç işin gösterildiği şema. Sonraki işe, çıkış anahtarlarının her biri için bir tane olmak üzere üç dizi iletilir. Her dizinin tek bir üyesi vardır.

Herhangi bir temel çakışma varsa bunlara karşılık gelen değerler gruplandırılır oluşturmaktır.

Çı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. Sonraki işe, her anahtar için bir tane olmak üzere iki dizi iletilir. Bu anahtara sahip iki çıkış olduğu için dizilerden birinde iki üye vardı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ı.

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

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şlerini tamamlamaları engellenir.

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.

Bir iş zincirini gösteren şema. İşlerden biri başarısız oldu, ancak bir geri çekme politikası tanımlanmış. Söz konusu iş, uygun süre geçtikten sonra yeniden çalışır. Zincirde ondan sonra gelen işler, başarılı bir şekilde çalışana kadar 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ğu için yeniden denenemiyor. 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. Herhangi bir bağımlı iş istekleri de CANCELLED olarak işaretlenir ve çalışmaları yürütülmez.

Bir iş zincirini gösteren şema. Bir iş iptal edildi. Sonuç olarak, zincirde daha sonra bulunan tüm işler de iptal edilir.

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 İş.