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.