Çalışan İş Akışı

Worker kullandığınızda WorkManager Worker.doWork() adlı kişiye otomatik olarak telefon eder bir mesaj dizisinde yer alır. Arka plan ileti dizisi Executor kaynağından geliyor WorkManager'ın Configuration içinde belirtilir. WorkManager, varsayılan olarak sizin için bir Executor oluşturur. Ancak şunları da özelleştirebilirsiniz: oluşturmanız gerekir. Örneğin, bilgisayarınızda bulunan mevcut bir arka plan Yürütücüyü arka planda çalıştığından emin olmak için tek iş parçacıklı bir Executor oluşturun sırayla yürütülür veya özel bir Executor belirtin. Executor, WorkManager'ı manuel olarak başlattığınızdan emin olun.

WorkManager'ı manuel olarak yapılandırırken Executor öğenizi şu şekilde belirtebilirsiniz: şöyle olur:

Kotlin

WorkManager.initialize(
    context,
    Configuration.Builder()
         // Uses a fixed thread pool of size 8 threads.
        .setExecutor(Executors.newFixedThreadPool(8))
        .build())

Java

WorkManager.initialize(
    context,
    new Configuration.Builder()
        .setExecutor(Executors.newFixedThreadPool(8))
        .build());

Aşağıda, bir web sayfasının içeriğini indiren basit bir Worker örneği verilmiştir. 100 kez:

Kotlin

class DownloadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {

    override fun doWork(): ListenableWorker.Result {
        repeat(100) {
            try {
                downloadSynchronously("https://www.google.com")
            } catch (e: IOException) {
                return ListenableWorker.Result.failure()
            }
        }

        return ListenableWorker.Result.success()
    }
}

Java

public class DownloadWorker extends Worker {

    public DownloadWorker(Context context, WorkerParameters params) {
        super(context, params);
    }

    @NonNull
    @Override
    public Result doWork() {
        for (int i = 0; i < 100; i++) {
            try {
                downloadSynchronously("https://www.google.com");
            } catch (IOException e) {
                return Result.failure();
            }
        }

        return Result.success();
    }

}

Worker.doWork() özelliğinin bir senkronize çağrınız varsa, arka plan çalışmanızın tamamını bir engelleme modu kullanmayı deneyin ve yöntem çıkış yapana kadar işlemi tamamlayın. Bir doWork() içinde eşzamansız API oluşturur ve Result döndürürse geri çağırmanız ve düzgün çalışmayabilir. Bu durumdaysanız bir ListenableWorker kullanmayı düşünün (bkz. ListenableWorker'da Threading).

Çalışmakta olan Worker herhangi bir nedenle durdurulduğunda Worker.onStopped() numaralı telefona bir çağrı alır. Bu yöntemi geçersiz kılın veya Worker.isStopped() numaralı telefonu ara ve gerektiğinde kaynak tasarrufu sağlamak için Google Analytics'i kullanın. Worker durdurulduğunda, döngünün ortasında olabilir. indirme işlemini gerçekleştirecek ve durdurulmuş olsa bile devam edecektir. Alıcı: bu davranışı optimize etmek için aşağıdaki gibi bir işlem yapabilirsiniz:

Kotlin

class DownloadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {

    override fun doWork(): ListenableWorker.Result {
        repeat(100) {
            if (isStopped) {
                break
            }

            try {
                downloadSynchronously("https://www.google.com")
            } catch (e: IOException) {
                return ListenableWorker.Result.failure()
            }

        }

        return ListenableWorker.Result.success()
    }
}

Java

public class DownloadWorker extends Worker {

    public DownloadWorker(Context context, WorkerParameters params) {
        super(context, params);
    }

    @NonNull
    @Override
    public Result doWork() {
        for (int i = 0; i < 100; ++i) {
            if (isStopped()) {
                break;
            }

            try {
                downloadSynchronously("https://www.google.com");
            } catch (IOException e) {
                return Result.failure();
            }
        }

        return Result.success();
    }
}

Bir Worker durdurulduktan sonra nereden geri döndüğünüzün bir önemi yoktur Worker.doWork(); Result yoksayılır.