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.