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

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 yeni Worker öğ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 yeni PeriodicWorkRequest 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:

  1. 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 WorkRequest WorkRequest.id, videoyu sıraya almadan önce.
  2. Create new WorkRequest: Yeni bir WorkRequest oluşturun ve şunu kullanın: WorkRequest.Builder.setID() kullanarak kimliğini mevcut kimlikle eşleşecek şekilde ayarlamak WorkRequest.
  3. Kısıtlamalar ayarlayın: WorkRequest.Builder.setConstraints() WorkManager'a yeni kısıtlamalar eklendi.
  4. 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:

  1. WorkInfo: Örnek almak için WorkManager.getWorkInfoById() çağrısı WorkRequest metriğinize karşılık gelen WorkInfo.
    • 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.
  2. getGeneration: Şu örnekteki getGeneration() öğesini çağırın: WorkInfo. Döndürülen Int, WorkRequest.
    • Oluşturma alanı veya mülkü değil, yalnızca WorkInfo.getGeneration() yöntemini çağırın.

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()