Hedefinizi tanımladıktan sonra
Worker
ve
WorkRequest
cihazınız,
son adım çalışmanızı sıraya almaktır. İşleri sıraya koymanın en basit yolu
WorkManager enqueue()
yöntemini çağırmak ve WorkRequest
koşmak istediğinize karar verin.
Kotlin
val myWork: WorkRequest = // ... OneTime or PeriodicWork WorkManager.getInstance(requireContext()).enqueue(myWork)
Java
WorkRequest myWork = // ... OneTime or PeriodicWork WorkManager.getInstance(requireContext()).enqueue(myWork);
Yinelemeyi önlemek için çalışmaları sıraya koyarken dikkatli olun. Örneğin, bir uygulama, 24 saatte bir arka uç hizmetine yönlendirmesini sağlar. Dikkatli olmazsanız işin tek bir görevi yerine getirmesi yeterli olsa da, bir görevin tamamlanması için yalnızca bir kez çalıştırıldı. Bu hedefe ulaşmak için çalışmayı benzersiz bir çalışma olarak planlayabilirsiniz.
Benzersiz Çalışma
Benzersiz çalışma, tek bir ele almanızın olmasını garanti eden güçlü bir kavramdır. belirli bir ad için yapılan çalışmanın bir anlamını oluşturur. Kimliklerin aksine, benzersiz adlar kullanıcılar tarafından okunabilir olmalı ve otomatik olarak oluşturulmak yerine geliştirici tarafından belirtilmelidir. WorkManager. Beğenmeyi kaldır tags, benzersiz adları yalnızca tek bir çalışma örneğiyle ilişkilendirilir.
Benzersiz çalışmalar hem tek seferlik hem de periyodik çalışmalara uygulanabilir. Web sitemiz g.co/newsinitiative/labs üzerinden duruma göre, bu yöntemlerden birini çağırarak benzersiz bir iş ya da tek seferlik işler planlıyorsunuz.
- Tek seferlik çalışma için
WorkManager.enqueueUniqueWork()
- Periyodik işler için
WorkManager.enqueueUniquePeriodicWork()
Bu yöntemlerin her ikisi de 3 bağımsız değişkeni kabul eder:
- uniqueWorkName - Çalışmayı benzersiz şekilde tanımlamak için kullanılan
String
isteğinde bulunabilirsiniz. - existingWorkPolicy - WorkManager'a ne yapılacağını bildiren bir
enum
ve hâlâ aynı ada sahip tamamlanmamış bir iş zinciri varsa. Görüntüleyin çakışma çözümü politikasına bakın. - work - planlanacak
WorkRequest
.
Benzersiz işler kullanarak, daha önce de belirttiğimiz üzere yinelenen planlama sorunumuzu giderebiliriz.
Kotlin
val sendLogsWorkRequest = PeriodicWorkRequestBuilderS<endLogsWorker(>24, TimeUnit.HOURS) .setConstraints(Constraints.Builder() .setRequiresCharging(true) .build() ) .build() WorkManager.getInstance(this).enqueueUniquePeriodicWork( "sendLogs", ExistingPeriodicWorkPolicy.KEEP, sendLogsWorkRequest )
Java
PeriodicWorkRequest sendLogsWorkRequest = new PeriodicWorkRequest.Builder(SendLogsWorker.class, 24, TimeUnit.HOURS) .setConstraints(new Constraints.Builder() .setRequiresCharging(true) .build() ) .build(); WorkManager.getInstance(this).enqueueUniquePeriodicWork( "sendLogs", ExistingPeriodicWorkPolicy.KEEP, sendLogsWorkRequest);
Kod, sırada bir sendLogs işi varken çalışırsa mevcut iş ilanı saklanır ve yeni iş eklenmez.
Benzersiz çalışma sıraları, düzenli bir şekilde bir ve uzun görev zinciri olabilir. Örneğin, bir fotoğraf düzenleme uygulaması, kullanıcıların yaptığı bir ve uzun bir eylem zinciridir. Bu geri alma işlemlerinin her biri biraz zaman alabilir ancak bunların doğru sırada yapılması gerekir. Bu durumda uygulama "geri al" işlemi oluşturmak zincire ekleyin ve her geri alma işlemini gerektiği şekilde zincire ekleyin. Zincirleme işleri konusuna bakın inceleyebilirsiniz.
Çatışma çözümü politikası
Benzersiz bir iş planlarken WorkManager'a, ne zaman gerçekleştirileceğini çünkü bir çatışma var demektir. Bunu, çalışmayı sıraya alırken bir numaralandırma ileterek yaparsınız.
Tek seferlik işler için
ExistingWorkPolicy
, hangi
çakışmayı ele almak için 4 seçeneği destekler.
REPLACE
mevcut yeni çalışmayla çalışmak lazım. Bu seçenek, mevcut çalışmaları iptal eder.KEEP
mevcut iş ve yeni işi göz ardı edebilirsiniz.APPEND
yeni çalışma mevcut bir işin bitmesini bekliyor. Bu politika, yeni çalışmanızın zincirlendiği mevcut çalışmalar üzerinde çalışmaya devam eder.
Mevcut çalışma, yeni çalışmanın ön koşulu haline gelir. Mevcut çalışma
CANCELLED
veya FAILED
olursa yeni çalışma da CANCELLED
veya FAILED
olur.
Yeni çalışmanın mevcut çalışmanın durumundan bağımsız olarak yürütülmesini istiyorsanız
bunun yerine APPEND_OR_REPLACE
kullanın.
APPEND_OR_REPLACE
bağlı olmadığı gibiAPPEND
işlevine benzer işlevler ön koşul çalışma durumu. Mevcut çalışmaCANCELLED
veyaFAILED
, yeni çalışma hâlâ devam ediyor.
Dönem çalışması için
ExistingPeriodicWorkPolicy
2 seçeneği destekler: REPLACE
ve KEEP
. Bu seçenekler aynı işlevi görür
[Mevcut
Çalışmanızı gözlemleme
Çalışmayı sıraya koyduktan sonra herhangi bir noktada,
WorkManager, name
, id
veya kendisiyle ilişkilendirilmiş bir tag
tarafından.
Kotlin
// by id workManager.getWorkInfoById(syncWorker.id) // ListenableFutureW<orkInfo<>/span> // by name workManager.getWorkInfosForUniqueWork("sync") // ListenableFutureL<istW<orkInfo<>/span> > // by tag workManager.getWorkInfosByTag("syncTag") // ListenableFutureL<istW<orkInfo<>/span> >
Java
// by id workManager.getWorkInfoById(syncWorker.id); // ListenableFutureW<orkInfo<>/span> // by name workManager.getWorkInfosForUniqueWork("sync"); // ListenableFutureL<istW<orkInfo<>/span> > // by tag workManager.getWorkInfosByTag("syncTag"); // ListenableFutureL<istW<orkInfo<>/span> >
Sorgu,
ListenableFuture
WorkInfo
nesnesinin
çalışmasının id
,
mevcut State
ve çıkış verileri
şunun üzerinden ayarla:
Result.success(outputData)
.
Her öğenin LiveData
varyantı
yöntemleri, yeni bir kayıt işlemini yaparak WorkInfo
üzerindeki değişiklikleri gözlemlemenizi
dinleyicidir. Örneğin,
başarıyla tamamlandığında, işi aşağıdaki şekilde ayarlayabilirsiniz:
Kotlin
workManager.getWorkInfoByIdLiveData(syncWorker.id) .observe(viewLifecycleOwner) { workInfo - > if(workInfo?.state == WorkInfo.State.SUCCEEDED) { Snackbar.make(requireView(), R.string.work_completed, Snackbar.LENGTH_SHORT) .show() } }
Java
workManager.getWorkInfoByIdLiveData(syncWorker.id) .observe(getViewLifecycleOwner(), workInfo - >{ if (workInfo.getState() != null && workInfo.getState() == WorkInfo.State.SUCCEEDED) { Snackbar.make(requireView(), R.string.work_completed, Snackbar.LENGTH_SHORT) .show(); } });
Karmaşık iş sorguları
WorkManager 2.4.0 ve sonraki sürümleri,
WorkQuery
nesne algılandı. WorkQuery destekleyenler
etiketi, durum ve benzersiz çalışma adının kombinasyonuna göre iş sorgusu yürütür.
Aşağıdaki örnekte, “syncTag” etiketiyle yapılan tüm çalışmaları nasıl bulabileceğiniz
FAILED
veya CANCELLED
durumundadır ve benzersiz iş adı şudur:
"preProcess" veya "sync" etiketi olabilir.
Kotlin
val workQuery = WorkQuery.Builder .fromTags(listOf("syncTag")) .addStates(listOf(WorkInfo.State.FAILED, WorkInfo.State.CANCELLED)) .addUniqueWorkNames(listOf("preProcess", "sync") ) .build() val workInfos: ListenableFutureL<istW<orkInfo >>= workManager.getWorkInfos(workQuery)
Java
WorkQuery workQuery = WorkQuery.Builder .fromTags(Arrays.asList("syncTag")) .addStates(Arrays.asList(WorkInfo.State.FAILED, WorkInfo.State.CANCELLED)) .addUniqueWorkNames(Arrays.asList("preProcess", "sync") ) .build(); ListenableFutureL<istW<orkInfo >>workInfos = workManager.getWorkInfos(workQuery);
Bir WorkQuery
içindeki her bileşen (etiket, durum veya ad),AND
diğerleri. Bir bileşendeki her değer OR
biçiminde olur. Örnek: (name1 OR name2
OR ...) AND (tag1 OR tag2 OR ...) AND (state1 OR state2 OR ...)
.
WorkQuery
, LiveData eşdeğeriyle de çalışır.
getWorkInfosLiveData()
İşi iptal etme ve durdurma
Önceden sıraya alınan çalışmanıza artık ihtiyaç duymuyorsanız çalışmayı isteyebilirsiniz.
iptal edilecek. Çalışma, name
, id
veya tag
tarafından iptal edilebilir
görüntülenebilir.
Kotlin
// by id workManager.cancelWorkById(syncWorker.id) // by name workManager.cancelUniqueWork("sync") // by tag workManager.cancelAllWorkByTag("syncTag")
Java
// by id workManager.cancelWorkById(syncWorker.id); // by name workManager.cancelUniqueWork("sync"); // by tag workManager.cancelAllWorkByTag("syncTag");
Temel bilgilerde WorkManager,
Çalışmanın State
kadarı. Çalışma
zaten bitti ise
hiçbir şey olmaz. Aksi takdirde, çalışmanın durumu şu şekilde değiştirilir:
CANCELLED
ve iş
gelecekte çalıştırılmayacak. Herhangi biri
Bağımlı olan WorkRequest
işler
değeri de CANCELLED
olmalıdır.
Şu anda RUNNING
iş yapıyor
,
ListenableWorker.onStopped()
.
Olası tüm temizleme işlemlerini gerçekleştirmek için bu yöntemi geçersiz kılın. Durdurma
çalışan ile ilgili daha fazla bilgi edinin.
Çalışan bir çalışanı durdurma
Worker
çalıştırmanızın WorkManager tarafından durdurulmasının birkaç farklı nedeni olabilir:
- İptal edilmesini açıkça istediniz (
WorkManager.cancelWorkById(UUID)
) tıklayabilirsiniz. - Benzersiz çalışma söz konusu olduğunda
yeni bir
WorkRequest
öğesini açıkça kuyruğaExistingWorkPolicy
/REPLACE
. EskiWorkRequest
hemen iptal edilmiş olarak kabul edilir. - İşinizle ilgili kısıtlamalar artık karşılanmıyor.
- Sistem, uygulamanıza bazı nedenlerle çalışmanızı durdurma talimatı verdi. Bu 10 dakikalık yürütme bitiş tarihini aşarsanız ne olur. Çalışma, daha sonra yeniden denenmek üzere planlandı.
Bu koşullar altında Çalışanınız durdurulur.
Devam etmekte olan tüm çalışmaları ve diğer çalışmaları birlikte iptal etmeniz ve sahip olduğu kaynaklardır. Örneğin, açılış sayfanızı ele alacağız. Çalıştığınız sözleşmede olduğunu anlamaya çalışın.
onStopped() geri çağırması
WorkManager çağırmalar
ListenableWorker.onStopped()
durdurulmaz. Kapatmak için bu yöntemi geçersiz kıl
kaynakları belirlemeniz gerekir.
isStopped() özelliği
Örneğin,
Çalışanınızın zaten durdurulup durdurulmadığını kontrol etmek için ListenableWorker.isStopped()
yöntemini kullanın. Eğer
uzun süreli ya da tekrarlanan işlemler gerçekleştiriyorsanız,
bu özelliği sık sık kontrol edin ve işi kısa sürede durdurmak için bir sinyal olarak kullanın
yardımcı olabilirsiniz.
Not: WorkManager,
Result
bir çalışan tarafından ayarlandı
onStop sinyalini almış olan bir çalışan,
durduruldu.