WorkManager, sıraya aldığınız bir WorkRequest
dosyasını güncellemenize olanak tanır. Bu, genellikle kısıtlamaları sık sık değiştiren veya çalışanlarını anında güncellemesi gereken büyük uygulamalarda gereklidir. WorkManager 2.8.0 sürümüyle birlikte bu işlemi updateWork()
API üzerinden gerçekleştirebilirsiniz.
updateWork()
yöntemi, bir WorkRequest
öğesinin belirli özelliklerini anında değiştirmenize ve yenisini manuel olarak iptal edip sıraya koymanıza gerek kalmadan değişiklik yapmanıza olanak tanır. Bu, geliştirme sürecini
büyük ölçüde basitleştirir.
İşleri iptal etmekten kaçınma
Genellikle mevcut bir WorkRequest'i iptal etmekten ve yenisini sıraya eklemekten kaçınmanız gerekir. Bu durum, uygulamanın belirli görevleri tekrar etmesine neden olabilir ve önemli miktarda ek kod yazmanızı gerektirebilir.
Bir WorkRequest'i iptal etmenin neden zorluklara neden olabileceğine ilişkin aşağıdaki örnekleri düşünün:
- Arka uç isteği: Sunucuya gönderilecek bir yükü hesaplarken bir
Worker
'i iptal ederseniz yeniWorker
ürününün baştan başlaması ve pahalı olabilecek yükü yeniden hesaplaması gerekir. - Planlama: Bir
PeriodicWorkRequest
işlemini iptal ederseniz ve yeniPeriodicWorkRequest
uygulamasının aynı programa göre çalışmasını isterseniz yeni yürütme süresinin önceki iş isteğiyle uyumlu olmasını sağlamak için bir zaman farkı hesaplamanız gerekir.
updateWork()
API, yeni bir isteği iptal etme ve sıraya ekleme zahmetine girmeden iş isteğinin kısıtlamalarını ve diğer parametrelerini güncellemenize olanak tanır.
İş ne zaman iptal edilmeli?
Bazı durumlarda updateWork()
numarasını aramak yerine doğrudan WorkRequest
işlemini iptal etmeniz gerekir. Sıraya aldığınız çalışmanın temel yapısını
değiştirmek istediğinizde yapmanız gereken budur.
Çalışmanız ne zaman güncellenmelidir?
Kullanıcının fotoğraflarını günlük olarak yedekleyen bir fotoğraf uygulaması düşünün. Bunu yapmak için bir PeriodicWorkRequest
sıraya koydu. WorkRequest
, cihazın şarj olmasını ve kablosuz ağa bağlı olmasını gerektiren kısıtlamalara sahip.
Ancak kullanıcı hızlı bir şarj cihazıyla cihazını yalnızca günde 20 dakika boyunca şarj eder. Bu durumda uygulama, şarj kısıtlamasını gevşetmek için WorkRequest
cihazını güncellemek isteyebilir. Böylece, cihaz tam olarak şarj edilmemiş olsa bile fotoğrafları yüklemeye devam edebilir.
Bu durumda, iş isteğinin kısıtlamalarını güncellemek için updateWork()
yöntemini kullanabilirsiniz.
İş adresini güncelleme
updateWork()
yöntemi, mevcut bir WorkRequest
iznini iptal edip yenisini sıraya eklemek zorunda kalmadan basit bir güncelleme yöntemi sunar.
Sıraya alınan çalışmaları güncellemek için aşağıdaki adımları uygulayın:
- Sıraya alınmış çalışmaların mevcut kimliğini al: Güncellemek istediğiniz WorkRequest'in kimliğini alın. Bu kimliği,
getWorkInfo
API'lerinin herhangi biriyle veya ilk WorkRequest'teki kimliği daha sonra almak üzere sıraya koymadan önceWorkRequest.id
genel mülküyle manuel olarak koruyarak alabilirsiniz. - Yeni WorkRequest oluştur: Yeni bir
WorkRequest
oluşturun ve kimliğini mevcutWorkRequest
ile eşleşecek şekilde ayarlamak içinWorkRequest.Builder.setID()
kullanın. - Kısıtlama ayarlama: WorkManager'a yeni kısıtlamaları aktarmak için
WorkRequest.Builder.setConstraints()
kullanın. - call updateWork: Yeni WorkRequest'i
updateWork()
adlı cihaza iletin.
İş örneğini güncelleyin
Fotoğraf yüklemek için kullanılan WorkRequest
öğesinin pil kısıtlamalarını değiştirmek için updateWork()
yönteminin nasıl kullanılacağını gösteren Kotlin'deki örnek bir kod snippet'ini burada bulabilirsiniz:
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 yönetin
updateWork()
, bir ListenableFuture<UpdateResult>
döndürür. Verilen UpdateResult
, WorkManager'ın değişikliklerinizi uygulayıp uygulayamayacağını özetleyen çeşitli değerlerden birine sahip olabilir. Ayrıca, değişikliğin ne zaman
uygulanabileceğini de gösterir.
Daha fazla bilgi için updateWork()
ve UpdateResult
referansını inceleyin.
İşleri nesillerle birlikte takip edin
Bir WorkRequest
öğesini her güncellediğinizde, oluşturma bir birim artar. Bu sayede, şu anda hangi WorkRequest
için sıraya alınmış olduğunu tam olarak izleyebilirsiniz.
Nesiller, iş isteklerini gözlemlerken, takip ederken ve test ederken size daha fazla kontrol sağlar.
WorkRequest
oluşturmak için şu adımları uygulayın:
- WorkInfo:
WorkRequest
cihazınıza karşılık gelenWorkInfo
örneğini almak içinWorkManager.getWorkInfoById()
numaralı telefonu arayın.WorkInfo
döndüren çeşitli yöntemlerden birini çağırabilirsiniz. Daha fazla bilgi için WorkManager referansı bölümüne bakın.
- getGeneration:
WorkInfo
örneği içingetGeneration()
çağrısı yapın. DöndürülenInt
,WorkRequest
oluşturulmasına karşılık gelir.- Oluşturma alanı veya özelliği yoktur, yalnızca
WorkInfo.getGeneration()
yöntemi kullanılır.
- Oluşturma alanı veya özelliği yoktur, yalnızca
Kanal oluşturma örneği
Aşağıda, WorkRequest
oluşturmayı almak için yukarıda açıklanan iş akışının örnek uygulaması verilmiştir.
// 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()
İş bilgilerini güncelleme politikaları
Daha önce, periyodik çalışmaların güncellenmesi için önerilen çözüm, ExistingPeriodicWorkPolicy.REPLACE
politikasıyla bir PeriodicWorkRequest
sıraya almaktı.
Aynı benzersiz id
değerine sahip beklemede olan bir PeriodicWorkRequest
varsa yeni iş isteği iptal edilir ve silinir. Bu politika artık ExistingPeriodicWorkPolicy.UPDATE
kullanılan iş akışının lehine kullanımdan kaldırılmıştır.
Örneğin, enqueueUniquePeriodicWork
öğesini PeriodicWorkRequest
ile kullanırken yeni PeriodicWorkRequest
politikasını ExistingPeriodicWorkPolicy.UPDATE
politikasıyla başlatabilirsiniz. Aynı benzersiz ada sahip bekleyen bir PeriodicWorkRequest
varsa WorkManager bunu yeni spesifikasyonla günceller. Bu iş akışı uygulandıktan sonra, updateWork()
kullanılması gerekmez.