WorkManager, birden fazla bağımlı görevi belirten ve hangi sırada çalışmaları gerektiğini tanımlayan bir çalışma zinciri oluşturup sıraya koymanıza olanak tanır. Bu işlev özellikle birkaç görevi belirli bir sırayla çalıştırmanız gerektiğinde yararlıdır.
Bir iş zinciri oluşturmak için WorkManager.beginWith(OneTimeWorkRequest)
veya WorkManager.beginWith(List<OneTimeWorkRequest>)
kullanabilirsiniz. Her biri WorkContinuation
örneği döndürür.
Daha sonra then(OneTimeWorkRequest)
veya then(List<OneTimeWorkRequest>)
aracılığıyla bağımlı OneTimeWorkRequest
örnekleri eklemek için WorkContinuation
kullanılabilir.
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
zincirinizi enqueue()
için WorkContinuation.enqueue()
yöntemini kullanabilirsiniz.
Bir örnekle açıklayalım. Bu örnekte 3 farklı Çalışan işi, paralel olarak çalışacak şekilde yapılandırılmıştır. 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 çıktısı bir yükleme Çalışanına iletilir. Çalışan, sonuçları uzaktaki bir sunucuya yükler.
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 iş isteklerinin çıkışı alt öğelere giriş olarak iletilir. Dolayısıyla, 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:
OverwritingInputMerger
, tüm girişlerdeki tüm anahtarları çıkışa eklemeye çalışır. Çakışma olması durumunda, önceden ayarlanan 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 InputMerger
alt sınıfına geçerek kendi kullanım alanınızı yazabilirsiniz.
Üzerine YazmaInputMerger
OverwritingInputMerger
, varsayılan birleştirme yöntemidir. Birleştirmede anahtar çakışmaları varsa anahtarın en son değeri, sonuçta ortaya çıkan çıkış verilerindeki tüm önceki sürümlerin üzerine yazılır.
Örneğin, bitki girişlerinin her biri ilgili değişken adlarıyla eşleşen bir anahtara ("plantName1"
, "plantName2"
ve "plantName3"
) sahipse cache
çalışanına iletilen veriler üç anahtar/değer çiftine sahip olur.
Çakışma varsa "kazanır"ı tamamlayan son çalışan ve değeri cache
değerine iletilir.
İş istekleriniz paralel olarak yürütüldüğünden, işleyiş sırasına dair garanti verilmez. Yukarıdaki örnekte plantName1
, hangi değerin son yazıldığına bağlı olarak "tulip"
veya "elm"
değerini alabilir. Önemli bir çakışma olasılığınız varsa ve tüm çıkış verilerini bir birleştirmede korumanız gerekiyorsa ArrayCreatingInputMerger
daha iyi bir seçenek olabilir.
DiziOluşturmaGiriş Birleştirme
Yukarıdaki örnekte, İşçi isimli tüm bitki isimlerinden elde edilen çıktıları korumak istediğimiz için ArrayCreatingInputMerger
kullanmalıyız.
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şler. Anahtarların her biri benzersizse sonuç, tek öğeli bir diziden oluşur.
Anahtar çakışmaları varsa bunlara karşılık gelen değerler bir dizide birlikte gruplandırılır.
Zincirleme ve Çalışma Durumları
OneTimeWorkRequest
zincirleri, çalışmaları başarılı bir şekilde tamamlandığı (yani Result.success()
değeri döndürdüğü) sürece sıralı olarak yürütülür. İş istekleri çalışırken başarısız olabilir veya iptal edilebilir. Bu durum, bağımlı iş isteklerini aşağı yönde etkiler.
İlk OneTimeWorkRequest
bir iş istekleri zincirinde sıraya alındığında, bu ilk iş isteğinin çalışması 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. Çalışma, kök OneTimeWorkRequest
veya List<OneTimeWorkRequest>
dizininde başarıyla tamamlanırsa (yani Result.success()
döndürür) bir sonraki bağımlı çalışma istekleri grubu sıraya alınır.
Her iş isteği başarıyla tamamlandığı sürece bu kalıp, zincirdeki tüm çalışmalar tamamlanana dek iş istekleri zincirinizin geri kalanında yayılır. En basit ve genellikle tercih edilen durum bu olsa da hata durumlarının ele alınması da aynı derecede önemlidir.
Bir çalışan iş isteğinizi işlerken hata oluşursa bu isteği tanımladığınız bir geri yükleme politikasına göre yeniden deneyebilirsiniz. Bir zincirin parçası olan bir isteği yeniden denemek, yalnızca bu isteğin kendisine sağlanan giriş verileriyle yeniden deneneceği anlamına gelir. Paralel olarak yürütülen çalışmalar bu değişiklikten etkilenmez.
Özel yeniden deneme stratejilerini tanımlama hakkında daha fazla bilgi için Yeniden Deneme ve Geri Alma Politikası'nı inceleyin.
Bu yeniden deneme politikası tanımlanmamışsa, tükenmişse ya da OneTimeWorkRequest
öğesinin Result.failure()
değerini döndürdüğü bir duruma ulaşırsanız bu iş isteği ve tüm bağımlı iş istekleri FAILED.
olarak işaretlenir.
OneTimeWorkRequest
iptal edildiğinde de aynı mantık geçerlidir. Tüm bağımlı çalışma istekleri de CANCELLED
olarak işaretlenir ve bu isteklerin çalışmaları yürütülmez.
Başarısız olan veya iş isteklerini iptal eden bir zincire daha fazla iş isteği eklerseniz yeni eklenen iş isteğinizin de sırasıyla FAILED
veya CANCELLED
olarak işaretleneceğini unutmayın. Mevcut bir zincirin çalışmasını genişletmek istiyorsanız MevcutWorkPolicy'de APPEND_OR_REPLACE
bölümüne bakın.
İş istekleri zincirleri oluşturulurken, 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, zincirlerin tamamlanmamasına ve/veya beklenmeyen bir duruma yol açabilir.
Daha fazla bilgi için Çalışmayı İptal Etme ve Durdurma bölümüne bakın.