WorkManager, yeni bir WorkRequest
onu sıraya koydu. Bu genellikle, sık sık değişen büyük uygulamalarda gereklidir.
veya ihtiyaç duyduklarında
çalışanlarını güncelleyecek. WorkManager itibarıyla
Sürüm 2.8.0 kullanıyorsanız updateWork()
API bunu yapmanızı sağlar.
updateWork()
yöntemi, bir feed'in belirli yönlerini değiştirmenize
Manuel olarak uğraşmanıza gerek kalmadan, anında WorkRequest
ve yenisini sıraya
sokmak olabilir. Bu da geliştirme sürecini büyük ölçüde
bahsedeceğim.
İş iptal etmekten kaçınma
Genellikle mevcut bir İş İsteğini iptal etmekten ve yeni bir iş isteğini sıraya almaktan kaçınmalısınız. bir. Bunu yapmak, uygulamanın belirli görevleri tekrar etmesine neden olabilir ve yüksek miktarda ek kod yazmak gibi bir şey olabilir.
WorkRequest'in iptal edilmesinin neden olabileceği aşağıdaki örnekleri düşünün zorluklar:
- Arka uç isteği: Bir
Worker
işlem sırasında iptal ederseniz sunucuya gönderilecek bir yük varsa yeniWorker
öğesinin baştan başlaması ve potansiyel olarak pahalı yükü yeniden hesaplamamız gerekir. - Planlama: Bir
PeriodicWorkRequest
aboneliğinizi iptal ettiğinizde aynı plan doğrultusunda yürütmek için yeniPeriodicWorkRequest
gibi yeni yürütme zamanının uyumlu olmasını sağlamak için zaman farkını hesaplama isteği gönderin.
updateWork()
API, bir iş isteğinin kısıtlamalarını güncellemenize ve
diğer parametrelerin kullanılmasını sağlayabilirsiniz.
Çalışmayı ne zaman iptal etmelisiniz?
WorkRequest
yerine doğrudan iptal etmeniz gereken durumlar vardır.
updateWork()
numaralı telefonu arayın. Etiketlemeyi değiştirmek istediğinizde
sıraladığınız çalışmanın temel yapısı
İş adresi ne zaman güncellenmelidir?
Kullanıcının fotoğraflarını her gün yedekleyen bir fotoğraf uygulaması düşünün. İçinde
bunun için bir PeriodicWorkRequest
sıraya alındı. WorkRequest
özelliğinde kısıtlamalar var
ve kablosuz ağa bağlı olması gerekir.
Ancak kullanıcı, hızlı bir erişim noktasıyla cihazını yalnızca günde 20 dakika
şarj cihazı. Bu durumda, uygulama gevşetmek için WorkRequest
şarj kısıtlaması, böylece cihaz olsa bile fotoğrafları yüklemeye devam edebilir
Şarjının tam dolu olmadığından emin olun.
Bu durumda, çalışmayı güncellemek için updateWork()
yöntemini kullanabilirsiniz
kısıtlanmasından kaynaklanır.
İş adresi nasıl güncellenir?
updateWork()
yöntemi, mevcut bir
WorkRequest
, iptal edip yeni bir işlemi sıraya almak zorunda kalmadan.
Sıraya alınan çalışmayı güncellemek için şu adımları uygulayın:
- Sıraya alınmış çalışma için mevcut kimliği alma: Oluşturduğunuz WorkRequest'in kimliğini alın
, güncellemek istiyor. Bu kimliği
getWorkInfo
API'leriyle veya başlangıçtan itibaren kimliği manuel olarak Herkese açık mülkle daha sonra almak için WorkRequestWorkRequest.id
, videoyu sıraya almadan önce. - Create new WorkRequest: Yeni bir
WorkRequest
oluşturun ve şunu kullanın:WorkRequest.Builder.setID()
kullanarak kimliğini mevcut kimlikle eşleşecek şekilde ayarlamakWorkRequest
. - Kısıtlamalar ayarlayın:
WorkRequest.Builder.setConstraints()
WorkManager'a yeni kısıtlamalar eklendi. - Call updateWork: Yeni WorkRequest'i
updateWork()
kullanıcısına iletin.
İş örneği güncelleme
Burada,
Kullanılan WorkRequest
cihazının pil kısıtlamalarını değiştirmek için updateWork()
yöntemi
fotoğraf yüklemek için:
suspend fun updatePhotoUploadWork() {
// Get instance of WorkManager.
val workManager = WorkManager.getInstance(context)
// Retrieve the work request ID. In this example, the work being updated is unique
// work so we can retrieve the ID using the unique work name.
val photoUploadWorkInfoList = workManager.getWorkInfosForUniqueWork(
PHOTO_UPLOAD_WORK_NAME
).await()
val existingWorkRequestId = photoUploadWorkInfoList.firstOrNull()?.id ?: return
// Update the constraints of the WorkRequest to not require a charging device.
val newConstraints = Constraints.Builder()
// Add other constraints as required here.
.setRequiresCharging(false)
.build()
// Create new WorkRequest from existing Worker, new constraints, and the id of the old WorkRequest.
val updatedWorkRequest: WorkRequest =
OneTimeWorkRequestBuilder<MyWorker>()
.setConstraints(newConstraints)
.setId(existingWorkRequestId)
.build()
// Pass the new WorkRequest to updateWork().
workManager.updateWork(updatedWorkRequest)
}
Sonucu işleme
updateWork()
, ListenableFuture<UpdateResult>
döndürür. Verilen
UpdateResult
, olup olmadığını belirten çeşitli değerlerden birine sahip olabilir
WorkManager, değişikliklerinizi uygulayabildi. Ayrıca ne zaman
tıklayın.
Daha fazla bilgi için updateWork()
ve UpdateResult
başlıklı makaleyi inceleyin.
referans.
İşleri nesillerle takip edin
Bir WorkRequest
öğesini her güncellediğinizde, oluşturma işlemi bir birim artar. Bu
, şu anda tam olarak hangi WorkRequest
için sıraya alınmış olduğunu izlemenizi sağlar.
Nesiller, çalışmaları gözlemler, takip eder ve test ederken size daha fazla kontrol sunar
kabul edersiniz.
WorkRequest
oluşturmak için şu adımları izleyin:
- WorkInfo: Örnek almak için
WorkManager.getWorkInfoById()
çağrısıWorkRequest
metriğinize karşılık gelenWorkInfo
.WorkInfo
döndüren çeşitli yöntemlerden birini çağırabilirsiniz. Daha fazla daha fazla bilgi için WorkManager referansı bölümüne bakın.
- getGeneration: Şu örnekteki
getGeneration()
öğesini çağırın:WorkInfo
. DöndürülenInt
,WorkRequest
.- Oluşturma alanı veya mülkü değil, yalnızca
WorkInfo.getGeneration()
yöntemini çağırın.
- Oluşturma alanı veya mülkü değil, yalnızca
Kanal oluşturma örneği
Aşağıda, kampanya için yukarıda açıklanan iş akışının bir örneği
WorkRequest
oluşturma işlemi alınıyor.
// Get instance of WorkManager.
val workManager = WorkManager.getInstance(context)
// Retrieve WorkInfo instance.
val workInfo = workManager.getWorkInfoById(oldWorkRequestId)
// Call getGeneration to retrieve the generation.
val generation = workInfo.getGeneration()
İş güncelleme politikaları
Önceden, periyodik işleri güncellemek için önerilen çözüm, bir veri kümesini
ExistingPeriodicWorkPolicy.REPLACE
politikasıyla PeriodicWorkRequest
.
Aynı benzersiz id
değerine sahip, bekleyen bir PeriodicWorkRequest
varsa yeni
iş isteği bunu iptal eder ve siler. Bu politika artık kullanımdan
ExistingPeriodicWorkPolicy.UPDATE
kullanarak iş akışına öncelik verebilirsiniz.
Örneğin, enqueueUniquePeriodicWork
birlikte bir
PeriodicWorkRequest
, yeni PeriodicWorkRequest
uygulamasını şu komutla başlatabilirsiniz:
ExistingPeriodicWorkPolicy.UPDATE
politikası. Kampanyada beklemede olan
PeriodicWorkRequest
öğesi aynı benzersiz ada sahipse WorkManager,
kullanıma sunuyoruz. Bu iş akışını takip ettiğinizde,
updateWork()