WorkManager, birden fazla bağımlı görevi belirten ve bunların hangi sırayla çalıştırılması gerektiğini tanımlayan bir çalışma zinciri oluşturup sıraya eklemenize olanak tanır. Bu işlev, özellikle birkaç görevi belirli bir sırayla çalıştırmanız gerektiğinde kullanışlıdır.
İş zinciri oluşturmak için her biri WorkContinuation örneği döndüren WorkManager.beginWith(OneTimeWorkRequest) veya WorkManager.beginWith(List<OneTimeWorkRequest>) yöntemini kullanabilirsiniz.
Ardından, then(OneTimeWorkRequest) veya then(List<OneTimeWorkRequest>) kullanarak bağımlı OneTimeWorkRequest örnekleri eklemek için bir WorkContinuation kullanılabilir.
WorkContinuation.then(...) her çağrıldığında WorkContinuation'ün yeni bir örneği döndürülür. OneTimeWorkRequest örnekten oluşan bir List eklerseniz bu istekler paralel olarak çalıştırılabilir.
Son olarak, WorkContinuation enqueue() için WorkContinuation.enqueue() yöntemini kullanabilirsiniz.
Bunu bir örnek üzerinden inceleyelim. Bu örnekte, 3 farklı Worker işi çalıştırılacak şekilde yapılandırılmıştır (potansiyel olarak paralel). Bu çalışanların sonuçları daha sonra birleştirilir ve önbelleğe alma çalışan işine aktarılır. Son olarak, bu işin çıkışı, sonuçları uzak bir sunucuya yükleyen bir yükleme Worker'ına iletilir.
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 iş isteklerine giriş olarak iletilir. Yukarıdaki örnekte plantName1, plantName2 ve plantName3 çı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:
OverwritingInputMergertüm girişlerdeki tüm anahtarları çıkışa eklemeye çalışır. Çakışma durumunda, daha önce ayarlanmış anahtarların üzerine yazılır.ArrayCreatingInputMergergirişleri birleştirmeye çalışır ve gerektiğinde diziler oluşturur.
Daha spesifik bir kullanım alanınız varsa InputMerger alt sınıfını oluşturarak kendi sınıfınızı yazabilirsiniz.
OverwritingInputMerger
OverwritingInputMerger, varsayılan birleştirme yöntemidir. Birleştirme işleminde anahtar çakışmaları varsa bir anahtarın en son değeri, sonuçta elde edilen çıkış verilerindeki önceki sürümlerin üzerine yazılır.
Örneğin, tesis girişlerinin her birinde 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 tamamlanan son çalışan "kazanır" ve değeri cache değerine iletilir.
İş istekleriniz paralel olarak çalıştırıldığından, çalışma sırası garanti edilmez. Yukarıdaki örnekte plantName1, en son yazılan değere bağlı olarak "tulip" veya "elm" değerini alabilir. Anahtar çakışması olasılığı varsa ve birleştirme işleminde tüm çıkış verilerini korumanız gerekiyorsa ArrayCreatingInputMerger daha iyi bir seçenek olabilir.
ArrayCreatingInputMerger
Yukarıdaki örnekte, tüm bitki adı çalışanlarının çıkışlarını korumak istediğimiz için 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 diziyle eşleştirir. Anahtarların her biri benzersizse sonucunuz tek öğeli dizilerden oluşan bir seri olur.
Anahtar çakışmaları varsa ilgili değerler bir dizide gruplandırılır.
Zincirleme ve Çalışma Durumları
OneTimeWorkRequest zincirleri, işleri başarıyla tamamlandığı (yani Result.success() döndürdüğü) sürece sırayla yürütülür. İş istekleri, çalışırken başarısız olabilir veya iptal edilebilir. Bu durum, bağımlı iş isteklerini de etkiler.
Bir iş isteği zincirinde ilk OneTimeWorkRequest sıraya alındığında, bu ilk iş isteğinin işi tamamlanana kadar sonraki tüm iş istekleri engellenir.
Sıraya alındıktan ve tüm iş kısıtlamaları karşılandıktan sonra ilk iş isteği çalışmaya başlar. Kök OneTimeWorkRequest veya List<OneTimeWorkRequest> içinde iş başarıyla tamamlanırsa (yani Result.success() döndürürse) bir sonraki bağımlı iş istekleri sıraya alınır.
Her iş isteği başarıyla tamamlandığı sürece bu model, zincirdeki tüm işler tamamlanana kadar iş istekleri zincirinizin geri kalanında yayılır. Bu en basit ve genellikle tercih edilen durum olsa da hata durumlarını ele almak da bir o kadar önemlidir.
Bir çalışan, iş isteğinizi işlerken hata oluşursa tanımladığınız geri çekilme politikasına göre bu isteği yeniden deneyebilirsiniz. Bir zincirin parçası olan isteği yeniden denemek, yalnızca o isteğin kendisine sağlanan giriş verileriyle yeniden deneneceği anlamına gelir. Paralel olarak çalışan işler etkilenmez.
Özel yeniden deneme stratejileri tanımlama hakkında daha fazla bilgi için Yeniden Deneme ve Geri Çekilme Politikası'na bakın.
Bu yeniden deneme politikası tanımlanmamışsa veya tükenmişse ya da OneTimeWorkRequest öğesinin Result.failure() döndürdüğü bir duruma ulaşırsanız bu iş isteği ve tüm bağımlı iş istekleri FAILED. olarak işaretlenir.
Aynı mantık, OneTimeWorkRequest iptal edildiğinde de geçerlidir. Bağımlı iş istekleri de CANCELLED olarak işaretlenir ve bu isteklerin işleri yürütülmez.
Başarısız olan veya iptal edilen iş istekleri içeren bir zincire daha fazla iş isteği eklerseniz yeni eklenen iş isteğiniz de sırasıyla FAILED veya CANCELLED olarak işaretlenir. Mevcut bir zincirin çalışmasını genişletmek istiyorsanız ExistingWorkPolicy bölümündeki APPEND_OR_REPLACE konusuna bakın.
İş isteği zincirleri oluştururken bağımlı iş istekleri, işin her zaman zamanında tamamlanmasını sağlamak için yeniden deneme politikaları tanımlamalıdır. Başarısız iş istekleri, eksik zincirlere ve/veya beklenmedik durumlara neden olabilir.
Daha fazla bilgi için Çalışmayı İptal Etme ve Durdurma başlıklı makaleyi inceleyin.