GCMNetworkManager'dan WorkManager'a taşıma

Bu dokümanda, uygulamaları WorkManager istemci kitaplığını kullanmak için nasıl taşıyacağınız açıklanmaktadır kitaplığının arka plan işlemlerini gerçekleştirmesine yardımcı olur. İlgili içeriği oluşturmak için kullanılan uygulamaların arka plan işlerini planlamak için tercih edilen yöntemi WorkManager'ı kullanmaktır. Ölçüt WorkManager GCM kitaplığını da içeren bir diğer sürüm ise WorkManager'ı kullanarak API düzeyi 22'ye sahip Android cihazlarda çalışırken görevleri planlamak için GCM veya daha düşük olmasını sağlayın.

WorkManager'a taşı

Uygulamanız şu anda arka plan işlemlerini gerçekleştirmek için GCMNetworkManager'ı kullanıyorsa, WorkManager'a geçmek için aşağıdaki adımları uygulayın.

Aşağıdaki adımlar için şunlarla başladığınızı varsayıyoruz: Görevinizi tanımlayan ve planlayan GCMNetworkManager kodu:

Kotlin

val myTask = OneoffTask.Builder()
    // setService() says what class does the work
    .setService(MyUploadService::class.java)
    // Don't run the task unless device is charging
    .setRequiresCharging(true)
    // Run the task between 5 & 15 minutes from now
    .setExecutionWindow(5 * DateUtil.MINUTE_IN_SECONDS,
            15 * DateUtil.MINUTE_IN_SECONDS)
    // Define a unique tag for the task
    .setTag("test-upload")
    // ...finally, build the task and assign its value to myTask
    .build()
GcmNetworkManager.getInstance(this).schedule(myTask)

Java

// In GcmNetworkManager, this call defines the task and its
// runtime constraints:
OneoffTask myTask = new OneoffTask.Builder()
    // setService() says what class does the work
    .setService(MyUploadService.class)
    // Don't run the task unless device is charging
    .setRequiresCharging(true)
    // Run the task between 5 & 15 minutes from now
    .setExecutionWindow(
        5 * DateUtil.MINUTE_IN_SECONDS,
        15 * DateUtil.MINUTE_IN_SECONDS)
    // Define a unique tag for the task
    .setTag("test-upload")
    // ...finally, build the task and assign its value to myTask
    .build();
GcmNetworkManager.getInstance(this).schedule(myTask);

Bu örnekte, MyUploadService öğesinin gerçek yükleme işlemini tanımladığını varsayarız:

Kotlin

class MyUploadService : GcmTaskService() {
    fun onRunTask(params: TaskParams): Int {
        // Do some upload work
        return GcmNetworkManager.RESULT_SUCCESS
    }
}

Java

class MyUploadService extends GcmTaskService {
    @Override
    public int onRunTask(TaskParams params) {
        // Do some upload work
        return GcmNetworkManager.RESULT_SUCCESS;
    }
}

WorkManager kitaplıklarını dahil etme

WorkManager sınıflarını kullanmak için WorkManager kitaplığını ve bağımlılık oluşturmaktır. Ayrıca, yeni Google Slaytlar API'lerini içeren WorkManager GCM kitaplığını da WorkManager, uygulamanız şu cihazlarda çalışırken iş planlaması için GCM'yi kullanmasını sağlar: JobScheduler'ı desteklemeyen cihazlar (yani API düzeyi 22'yi çalıştıran cihazlar veya daha düşük). Kitaplık ekleme hakkında ayrıntılı bilgi için WorkManager içinde).

Manifest dosyanızı değiştirin

GCMNetworkManager'ı uyguladığınızda bir Uygulama manifest dosyanıza, GcmNetworkManager içinde açıklandığı şekilde GcmTaskService referans belgeleri. GcmTaskService gelen göreve bakar ve görev için delege eder gösterir. WorkManager, Çalışanınıza görev yetkisini yönettiğinden Bunu yapacak bir sınıfa ihtiyacınız var; GcmTaskService öğesini şuradan kaldırmanız yeterlidir: manifest'ini kullanabilirsiniz.

Çalışanı Tanımlama

GCMNetworkManager uygulamanız bir OneoffTask veya RecurringTask tanımlar, tam olarak hangi çalışmaların yapılması gerektiğini belirler. Bunu yeniden yazmalı Worker, Çalışmanızı tanımlama bölümünde açıklandığı üzere geçerlidir.

Örnek GCMNetworkManager kod bir myTask görevini tanımlar. WorkManager eşdeğeri şuna benzer:

Kotlin

class UploadWorker(context: Context, params: WorkerParameters)
                        : Worker(context, params) {
    override fun doWork() : Result {
        // Do the upload operation ...
        myUploadOperation()

        // Indicate whether the task finished successfully with the Result
        return Result.success()
    }
}

Java

public class UploadWorker extends Worker {

    public UploadWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
        super(context, params);
    }

    @Override
    public Result doWork() {
      // Do the upload operation ...

      myUploadOperation()

      // Indicate whether the task finished successfully with the Result
      return Result.success()
    }
}

GCM görevi ile Worker arasında birkaç fark vardır:

  • GCM, parametreleri göreve geçirmek için bir TaskParams nesnesi kullanır. İlgili içeriği oluşturmak için kullanılan WorkManager, WorkRequest üzerinde belirleyebileceğiniz giriş verilerini kullanır. WorkManager sayfası için giriş/çıkışı tanımlama üzerine düşünün. Her iki durumda da kalıcı öğeler için anahtar/değer çiftlerini iletebilirsiniz. parametrelerin sayısını araştırırsınız.
  • GcmTaskService, aşağıdaki gibi işaretler döndürerek başarılı veya başarısız olduğunu belirtir GcmNetworkManager.RESULT_SUCCESS. Bir WorkManager Worker, sonuçlarını işaret ediyor üzerinde bir ListenableWorker.Result yöntem, örneğin ListenableWorker.Result.success(), ve bu yöntemin döndürülen değerini döndürür.
  • Daha önce belirttiğimiz gibi, bir etkinliği tanımlarken kısıtlamaları veya etiketleri Worker; bunun yerine, bu işlemi bir sonraki adımda, WorkRequest.

İş isteğini programlama

Worker tanımlamak, neye ihtiyacınız olduğunu belirtir. Çalışmanın ne zaman nasıl yapılacağını tanımlamanız ve WorkRequest:

  1. Bir OneTimeWorkRequest oluşturun veya PeriodicWorkRequest ve görevin ne zaman gerçekleşeceğini belirten istediğiniz kısıtlamaların yanı sıra etiketleri de kullanabilirsiniz.
  2. İsteği şu kullanıcıya ilet: WorkManager.enqueue() için sıraya sokmak da önemlidir.

Örneğin, önceki bölümde bir OneoffTask değerini, eşdeğer bir Worker olarak ekleyebilirsiniz. Ancak bu Worker şunları içermiyor: OneoffTask nesnesinin yürütme kısıtlamalarını ve etiketini içerir. Bunun yerine, kısıtlamalarını ve görev kimliğini belirtir.WorkRequest Ayrıca, bir sonraki videoda bu görev, ağ bağlantısı olmadığı sürece çalışmamalıdır. Herhangi bir teknik GCMNetworkManager ile açıkça bir ağ bağlantısı isteğinde bulunmak için GCMNetworkManager varsayılan olarak bir ağ bağlantısı gerektirir, ancak WorkManager bunu gerektirir Siz özellikle eklemediğiniz sürece ağ bağlantısı gerektirmez. WorkRequest tanımlandıktan sonra WorkManager ile sıraya alınır.

Kotlin

val uploadConstraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true).build()

val uploadTask = OneTimeWorkRequestBuilder<UploadWorker>()
    .setConstraints(uploadConstraints)
    .build()
WorkManager.getInstance().enqueue(uploadTask)

Java

Constraints uploadConstraints = new Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .setRequiresCharging(true)
    .build();

OneTimeWorkRequest uploadTask =
        new OneTimeWorkRequest.Builder(UploadWorker.class)
  .setConstraints(uploadConstraints)
  .build();
WorkManager.getInstance().enqueue(uploadTask);

API eşlemeleri

Bu bölümde, bazı GCMNetworkManager özelliklerinin ve kısıtlamalarının nasıl ve WorkManager'da kullanılan eşdeğerleridir.

Kısıtlama eşlemeleri

GCMNetworkManager, görevinizin ne zaman yapılması gerektiği konusunda gerekir. Çoğu durumda, net bir eşdeğer WorkManager kısıtlaması vardır. Bu bölümünde bu eşdeğerleri listelenmektedir.

GCMNetworkManager görevlerinde uygun yöntemi çağırarak kısıtlamalar ayarlayın görevin Oluşturucu nesnesi; Örneğin, ağ gereksiniminizi Task.Builder.setRequiredNetwork() aranıyor.

WorkManager'da bir Constraints.Builder nesnesi ve (örneğin, Constraints.Builder.setRequiredNetworkType()), daha sonra, Oluşturucu'yu kullanarak iş isteğinde bulunabilirsiniz. Daha fazla bilgi için bkz. Çalışmanızı tanımlama istekleri hakkında daha fazla bilgi edinin.

GCMNetworkManager kısıtlaması WorkManager eşdeğeri Notlar
setPersisted() (zorunlu değil) Tüm WorkManager işleri, cihaz yeniden başlatmalarında kalıcı olur
setRequiredNetwork() setRequiredNetworkType() Varsayılan olarak GCMNetworkManager ağ erişimi gerektirir. WorkManager, varsayılan olarak ağ erişimi gerektirmez. İşiniz için ağ erişimi gerekiyorsa setRequiredNetworkType(CONNECTED) ya da daha spesifik bir ağ türü ayarlamalısınız.
setRequiresCharging()

Diğer eşlemeler

Kısıtlamaların yanı sıra, GCMNetworkManager'a uygulayabileceğiniz başka ayarlar da var. görevlerden biridir. Bu bölümde, söz konusu ayarları bir kampanyaya uygulamak için kullanılan WorkManager işi.

Etiketler

Tüm GCMNetworkManager görevleri, İnşaatçı setTag() yöntemidir. WorkManager işleri bir kimlikle benzersiz şekilde tanımlanır: WorkManager tarafından otomatik olarak oluşturulur; şu numarayı arayarak öğrenebilirsiniz: WorkRequest.getId(). İçinde Ayrıca, iş isteklerinin isteğe bağlı olarak bir veya daha fazla etiketi olabilir. Şunun için bir etiket ayarlamak için: üzerinde çalıştığınız proje yöneticileri WorkRequest.Builder.addTag() yöntemini kullanın.WorkRequest

GCMNetworkManager'da şunu çağırabilirsiniz: setUpdateCurrent() kullanabilirsiniz. Eşdeğer WorkManager yaklaşımı, enqueueUniqueWork() veya enqueueUniquePeriodicWork(); bu yöntemleri kullanırsanız işe benzersiz bir ad verirsiniz ve ayrıca, Bu durumda bekleyen bir iş varsa WorkManager, isteği işlemelidir. dokunun. Daha fazla bilgi için Benzersiz verileri işleme iş.

Görev parametreleri

Şu çağrıyı yaparak parametreleri bir GCMNetworkManager işine aktarabilirsiniz: Task.Builder.setExtras() ve parametreleri içeren bir Bundle iletilmesini öneririz. WorkManager, tüm görevlerinizi WorkManager işine, parametreleri anahtar/değer olarak içeren bir Data nesnesi çiftler. Ayrıntılar için bkz. Giriş verilerini atayın.