İşleri yönetme

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.

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ığı gibi APPEND işlevine benzer işlevler ön koşul çalışma durumu. Mevcut çalışma CANCELLED veya FAILED, 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ğa ExistingWorkPolicy / REPLACE. Eski WorkRequest 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.