0Pricing
Android Academy · レッスン

Workerを作成する

Workerでバックグラウンド処理を定義します

「Workerを作成する」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。

ワーカーの作成

WorkManagerでバックグラウンド処理を実行する単位はワーカーです。ワーカーの基底クラスを継承し、そのworkメソッドをオーバーライドしてタスクを定義します。

CoroutineWorker

KotlinではCoroutineWorkerを継承します。doWork()はsuspend関数なので、他のsuspend関数を呼び出したり、バックグラウンド用のディスパッチャーで自然に実行したりできます。

class UploadWorker(
    context: Context,
    params: WorkerParameters
) : CoroutineWorker(context, params) {
    override suspend fun doWork(): Result {
        // background work here
        return Result.success()
    }
}

コンストラクター

すべてのワーカーは、コンストラクターでContextとWorkerParametersを受け取り、それらをスーパークラスに渡します。WorkManagerがワーカーをインスタンス化するため、コンストラクターを直接呼び出すことはありません。

doWorkはResultを返す

doWork()は、結果を示すResultを返す必要があります。可能性は3つあります。

  • Result.success()
  • Result.retry()
  • Result.failure()

Result.success

処理が完了したらResult.success()を返します。処理はキューから削除されます。チェーン内の後続処理に渡す出力データを付加することもできます。

override suspend fun doWork(): Result {
    uploadLogs()
    return Result.success()
}

Result.retry

一時的なネットワークエラーなど、一時的な失敗にはResult.retry()を返します。WorkManagerはバックオフポリシーに従い、後でワーカーを再実行します。

override suspend fun doWork(): Result {
    return try {
        syncData()
        Result.success()
    } catch (e: IOException) {
        Result.retry()
    }
}

Result.failure

入力が無効な場合など、再試行しても解決しない恒久的な失敗にはResult.failure()を返します。処理は停止し、依存するチェーン内の処理は実行されません。

入力データの読み取り

キューに追加するときにDataで小さな入力を渡し、ワーカー内でinputDataを使って読み取ります。大きなデータを渡す用途ではないため、サイズは小さく保ってください。

override suspend fun doWork(): Result {
    val userId = inputData.getString("user_id") ?: return Result.failure()
    sync(userId)
    return Result.success()
}

出力データの返却

ワーカーは結果にDataを含めて返すことができ、チェーン内の後続ワーカーはそれを入力として受け取ります。これにより、ステップ間で結果を渡せます。

val output = workDataOf("count" to 42)
return Result.success(output)

適切なディスパッチャーで実行する

CoroutineWorkerは、デフォルトではDispatchers.Default上でdoWork()を実行します。ブロッキングI/Oを行う場合はwithContext(Dispatchers.IO)に切り替え、Defaultのスレッドプールを使い果たさないようにします。

override suspend fun doWork(): Result = withContext(Dispatchers.IO) {
    readAndUploadFile()
    Result.success()
}

ワーカーを自己完結させる

ワーカーはスケジュールされてから長時間経過した後、新しいプロセスで実行されることがあります。メモリ上のアプリ状態に依存せず、必要な情報は入力データで渡すか、永続ストレージから読み取ってください。

確認テスト

ワーカーの作成について理解度を確認しましょう。

まとめ

ワーカーを作成しました。

  • CoroutineWorkerを継承し、suspend関数であるdoWork()をオーバーライドする
  • Result.success()、Result.retry()、またはResult.failure()を返す
  • inputDataを読み取り、出力のDataを返す
  • ブロッキング処理にはDispatchers.IOを使い、ワーカーを自己完結させる

次は、制約とスケジュール設定です。

よくある質問

「Workerを作成する」レッスンは無料ですか?

はい。「Workerを作成する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。

「Workerを作成する」で何を学びますか?

Workerでバックグラウンド処理を定義します ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Workerを作成する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. WorkManagerを使う場面
  2. Workerを作成する
  3. 制約とスケジューリング
  4. 定期処理と連結処理
← Android Academyに戻る