WorkManager, birden fazla bağımlı görevi belirten ve bunların hangi sırada çalıştırılacağını tanımlayan bir çalışma zinciri oluşturup sıraya almanıza olanak tanır. 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
örneğinin List
'ünü 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, paralel olarak çalışacak şekilde yapılandırılmıştır. Bu çalışanların sonuçları daha sonra birleştirilir ve bir önbelleğe alma çalışanı işine aktarılır. Son olarak, bu işin çıkışı bir yükleme işleyicisine iletilir. Yükleme işleyici, sonuçları uzak 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ştirmeleri
OneTimeWorkRequest
örneklerini zincirlediğinizde, ü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, daha önce ayarlanmış 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 InputMerger
alt sınıfına geçerek kendi kullanım alanınızı yazabilirsiniz.
OverwritingInputMerger
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, 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.
Çakışma varsa "kazanır"ı tamamlayan son çalışan ve değeri cache
değerine iletilir.
İş istekleriniz paralel olarak çalıştırıldığı için çalıştırılma sırası konusunda garanti verilmez. Yukarıdaki örnekte plantName1
, en son hangi değerin yazıldığına bağlı olarak "tulip"
veya "elm"
değerini tutabilir. Anahtar çakışması olasılığınız varsa ve bir birleştirme işleminde tüm çıkış verilerini korumanız gerekiyorsa 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 bir anahtarı bir dizi ile eşleştirir. 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ı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ş isteği zincirine eklendiğinde, bu ilk iş isteğinin çalışması tamamlanana kadar sonraki tüm iş istekleri engellenir.
İlk iş isteği, sıraya eklendikten ve tüm iş kısıtlamaları karşılandıktan sonra ç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, 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 işleyici, iş isteğinizi işlerken hata oluştuğunda tanımladığınız geri çekilme politikasına göre bu isteği yeniden deneyebilirsiniz. Bir zincirin 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 Politikası'nı inceleyin.
Bu yeniden deneme politikası tanımlanmamışsa veya tükenmişse ya da OneTimeWorkRequest
işlevinin Result.failure()
döndürdüğü bir duruma ulaşırsanız söz konusu 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 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ışma süresini uzatmak istiyorsanız ExistingWorkPolicy bölümündeki APPEND_OR_REPLACE
bölümüne bakın.
Bağımlı iş istekleri, iş isteklerinin her zaman zamanında tamamlanmasını sağlamak için iş isteği zincirleri oluşturulurken yeniden deneme politikalarını tanımlamalıdır. Başarısız çalışma istekleri, eksik zincirlere ve/veya beklenmedik duruma neden olabilir.
Daha fazla bilgi için İşi İptal Etme ve Durdurma başlıklı makaleyi inceleyin.