Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

ワーカーのスレッド化

Worker を使用すると、WorkManager がバックグラウンド スレッドで自動的に Worker.doWork() を呼び出します。バックグラウンド スレッドは、WorkManager の Configuration で指定された Executor で生成されます。デフォルトでは、WorkManager が Executor を設定しますが、カスタマイズすることも可能です。たとえば、アプリ内で既存のバックグラウンド Executor を共有したり、シングルスレッドの Executor を作成してすべてのバックグラウンド処理が連続的に実行されるようにしたりできます。さらに、別のスレッド カウントで ThreadPool を指定することもできます。Executor をカスタマイズするには、WorkManager の手動での初期化が有効になっていることを確認します。WorkManager を構成する際に、次のように Executor を指定できます。

Kotlin

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

Java

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

以下に、ウェブサイトのコンテンツを連続的にダウンロードするシンプルなワーカーの例を示します。

Kotlin

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

    override fun doWork(): ListenableWorker.Result {
        for (i in 0..99) {
            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() は同期呼び出しです。バックグラウンド処理全体をブロック方式で行い、メソッドが終了するまでに処理が完了することが求められます。doWork() で非同期 API を呼び出し、Result を返した場合、コールバックが適切に処理されないことがあります。このような場合は、ListenableWorker を使用することを検討してください(ListenableWorker でのスレッド化を参照)。

現在実行中の Workerなんらかの理由で停止された場合、Worker.onStopped() の呼び出しを受け取ります。コードにチェックポイントを設定し、必要に応じてリソースを解放するには、このメソッドをオーバーライドするか、Worker.isStopped() を呼び出します。上の例の Worker は、停止されたときにアイテムのダウンロードのループ中である可能性があり、その場合は停止されてもダウンロードを続行します。この動作を最適化するには、次のようにします。

Kotlin

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

    override fun doWork(): ListenableWorker.Result {
        for (i in 0..99) {
            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 が停止すると、Worker.doWork() から返される内容は重要でなくなります。そのため、Result は無視されるようになります。