Sıraya alınmış çalışmaları güncelleme

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 yeni Worker ürününün baştan başlaması ve pahalı olabilecek yükü yeniden hesaplaması gerekir.
  • Planlama: Bir PeriodicWorkRequest işlemini iptal ederseniz ve yeni PeriodicWorkRequest 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:

  1. 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 önce WorkRequest.id genel mülküyle manuel olarak koruyarak alabilirsiniz.
  2. Yeni WorkRequest oluştur: Yeni bir WorkRequest oluşturun ve kimliğini mevcut WorkRequest ile eşleşecek şekilde ayarlamak için WorkRequest.Builder.setID() kullanın.
  3. Kısıtlama ayarlama: WorkManager'a yeni kısıtlamaları aktarmak için WorkRequest.Builder.setConstraints() kullanın.
  4. 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:

  1. WorkInfo: WorkRequest cihazınıza karşılık gelen WorkInfo örneğini almak için WorkManager.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.
  2. getGeneration: WorkInfo örneği için getGeneration() çağrısı yapın. Döndürülen Int, WorkRequest oluşturulmasına karşılık gelir.
    • Oluşturma alanı veya özelliği yoktur, yalnızca WorkInfo.getGeneration() yöntemi kullanılır.

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.