Çalışan İş Akışı

Worker kullandığınızda WorkManager, arka plandaki bir iş parçacığında otomatik olarak Worker.doWork() ifadesini çağırır. Arka plan iş parçacığı, WorkManager'ın Configuration öğesinde belirtilen Executor öğesinden gelir. Varsayılan olarak, WorkManager sizin için bir Executor ayarlar, ancak kendiniz de özelleştirebilirsiniz. Örneğin, uygulamanızda mevcut bir arka plan Yürütücüsü paylaşabilir, tüm arka planınızın sırayla çalıştığından emin olmak için tek iş parçacıklı bir Executor oluşturabilir, hatta özel bir Executor belirtebilirsiniz. Executor öğesini özelleştirmek için WorkManager'ı manuel olarak başlattığınızdan emin olun.

WorkManager'ı manuel olarak yapılandırırken Executor öğenizi aşağıdaki gibi belirtebilirsiniz:

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

Bir web sayfasının içeriğini 100 kez indiren basit bir Worker örneğini burada görebilirsiniz:

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()'in eşzamanlı bir arama olduğunu unutmayın. Arka plan işlerinizin tamamını engelleme şeklinde yapmanız ve yöntemden çıkılana kadar bitirmeniz beklenir. doWork() içinde eşzamansız bir API çağırıp Result döndürürseniz geri çağırmanız düzgün çalışmayabilir. Bu durumdaysanız bir ListenableWorker kullanma seçeneğini değerlendirin (ListenableWorker'daki ileti dizisi oluşturma bölümüne bakın).

Şu anda çalışan bir Worker herhangi bir nedenle durdurulduğunda Worker.onStopped() numarasına bir arama alır. Bu yöntemi geçersiz kılın veya kodunuzu kontrol etmek ve gerektiğinde kaynakları boşa çıkarmak için Worker.isStopped() çağrısı yapın. Yukarıdaki örnekte verilen Worker durdurulduğunda, öğe indirme döngüsünün ortasında olabilir ve durdurulmuş olsa bile bunu yapmaya devam edecektir. Bu davranışı optimize etmek için şunun gibi bir şey 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();
    }
}

Worker durdurulduktan sonra Worker.doWork() kaynağından ne döndürdüğünüz önemli değildir; Result yoksayılır.