Tworzenie wątków w instancji roboczej

Jeśli korzystasz z narzędzia Worker, WorkManager automatycznie łączy się z: Worker.doWork() w wątku w tle. Wątek w tle pochodzi z: Executor jest określone w Configuration elementu WorkManager. Domyślnie WorkManager konfiguruje Executor, ale możesz też dostosować i własne. Można na przykład udostępnić istniejący Wykonawca działający w tle utwórz obiekt Executor jednowątkowy, aby mieć pewność, że całe tło działa uruchamia się sekwencyjnie, a nawet określa niestandardowy Executor. Aby dostosować Executor, pamiętaj, aby ręcznie zainicjować WorkManagera.

Podczas ręcznego konfigurowania WorkManagera możesz określić Executor jako następujące:

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

Oto przykład prostego polecenia Worker, które pobiera zawartość strony internetowej 100 razy:

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

}

Pamiętaj, że Worker.doWork() to synchronicznie – należy wykonać całą pracę w tle i dokończ ten proces przed zakończeniem metody. Jeśli wywołujesz asynchroniczny interfejs API w funkcji doWork() i zwracający Result, wywołanie zwrotne może nie działają poprawnie. Jeśli dotyczy Cię taka sytuacja, rozważ użycie ListenableWorker (zobacz Threading w ListenableWorker).

Gdy aktualnie uruchomiony Worker zostanie zatrzymany z dowolnego powodu, odbiera połączenie z numerem Worker.onStopped(). Zastąp tę metodę lub zadzwoń do: Worker.isStopped() do sprawdzania kodu i zwalniania zasobów w razie potrzeby. Gdy Worker w powyższym przykładzie została zatrzymana, może znajdować się w środku pętli pobieranie elementów będzie kontynuowane, mimo że proces został zatrzymany. Do możesz zoptymalizować to działanie, możesz zrobić coś takiego:

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

Po zatrzymaniu zadania Worker nie ma znaczenia, co wrócisz z Worker.doWork() Result zostanie zignorowany.