SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門

WorkManagerの発展的な使い方を解説 ──ワークチェイン、優先実行ワーカー、ワーカーの繰り返し実行

一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門 第11回

  • X ポスト
  • このエントリーをはてなブックマークに追加

 本連載は、「Android Studio2で始めるアプリ開発入門」連載、および『Androidアプリ開発の教科書』の続編にあたる内容として、Jetpackを取り上げていきます。第9回からは、バックグラウンド処理を管理できるWorkManagerを紹介しており、第9回である前編の基本的な使い方に続いて、中編である前回は応用的な使い方を紹介しました。今回は、WorkManagerを紹介する後編として、発展的な使い方を紹介します。具体的には、ワークチェイン、優先実行ワーカー、ワーカーの繰り返し実行を紹介します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

複数のワーカーのチェイン方法

 本連載は、Android Jetpackを紹介しています。前々回から3回にわたって、WorkManagerを紹介しています。今回は最後として、より発展的な内容を紹介します。まず、複数のワーカーを続けて実行する方法を紹介します。

 なお、今回の今回のサンプルデータは、GitHubから参照できます。

ワーカーを繋げるWorkContinuation

 これまで紹介してきたWorkManagerの使い方は、ひとつのワーカーを実行して終わりというものでした。それを数珠繋ぎに実行することができます。例えば、CreateCountWorker、ReceiveCountWorker、FinishCountWorkerの3個のワーカーがあるとします。そして、CreateCountWorkerが終了したのちにReceiveCountWorkerを実行し、ReceiveCountWorkerが終了したのちにFinishCountWorkerを実行することができます(図1)。

 このように、ひとつのワーカーの終了を受けて、続けて別のワーカーを実行することを、ワークチェインといいます。

図1: ワーカーを数珠繋ぎに実行するワークチェイン
図1: ワーカーを数珠繋ぎに実行するワークチェイン

 ワークチェインを実行する場合、WorkManagerへのキュー登録コードが、Javaではリスト1、Kotlinではリスト2のように変わってきます。

リスト1:ワークチェインの実行(Java版)[MainActivity.java]
OneTimeWorkRequest.Builder workRequestBuilder = new OneTimeWorkRequest.Builder(CreateCountWorker.class);  // (1)
OneTimeWorkRequest createCountWorkRequest = workRequestBuilder.build();  // (1)
workRequestBuilder = new OneTimeWorkRequest.Builder(ReceiveCountWorker.class);  // (2)
OneTimeWorkRequest receiveCountWorkRequest = workRequestBuilder.build();  // (2)
workRequestBuilder = new OneTimeWorkRequest.Builder(FinishCountWorker.class);  // (3)
OneTimeWorkRequest finishCountWorkRequest = workRequestBuilder.build();  // (3)
WorkManager workManager = WorkManager.getInstance(MainActivity.this);  // (4)
WorkContinuation workContinuation = workManager.beginWith(createCountWorkRequest);  // (5)
workContinuation = workContinuation.then(receiveCountWorkRequest);  // (6)
workContinuation = workContinuation.then(finishCountWorkRequest);  // (7)
workContinuation.enqueue();  // (8)
リスト2:ワークチェインの実行(Kotlin版)[MainActivity.kt]
var workRequestBuilder = OneTimeWorkRequestBuilder<CreateCountWorker>()  // (1)
val createCountWorkRequest = workRequestBuilder.build()  // (1)
workRequestBuilder = OneTimeWorkRequestBuilder<ReceiveCountWorker>()  // (2)
val receiveCountWorkRequest = workRequestBuilder.build()  // (2)
workRequestBuilder = OneTimeWorkRequestBuilder<FinishCountWorker>()  // (3)
val finishCountWorkRequest = workRequestBuilder.build()  // (3)
val workManager = WorkManager.getInstance(this@MainActivity)  // (4)
var workContinuation = workManager.beginWith(createCountWorkRequest)  // (5)
workContinuation = workContinuation.then(receiveCountWorkRequest)  // (6)
workContinuation = workContinuation.then(finishCountWorkRequest)  // (7)
workContinuation.enqueue()  // (8)

 リスト1、リスト2ともに、(1)〜(3)は、それぞれのワーカーのためのWorkRequestを生成しているコードです。(1)でCreateCountWorkerのcreateCountWorkRequest、(2)でReceiveCountWorkerのreceiveCountWorkRequest、(3)でFinishCountWorkerのfinishCountWorkRequestを生成しています。

 このうち、まず、CreateCountWorkerから起動するので、(4)で取得したWorkManagerオブジェクトに対して、createCountWorkRequestを登録します。その際に利用するメソッドは、enqueue()などのキュー登録ではなく、(5)のbeginWith()です。

 beginWith()メソッドの戻り値は、WorkContinuationオブジェクトです。このWorkContinuationオブジェクトのthen()メソッドを実行し、引数として、beginWith()で渡したワーカーに続けて実行するワーカーのWorkRequestを渡します。

 then()メソッドの戻り値もWorkContinuationオブジェクトなので、(6)や(7)のように続けて何回でもthen()メソッドを実行できます。そして、then()を実行した順序通りに、引数として渡されたWorkRequestのワーカーが実行されるようになっています。リスト1やリスト2では、(6)でreceiveCountWorkRequestを、(7)でfinishCountWorkRequestを渡しています。

 結果的に、以下の順序でワーカーが実行されるようになります

CreateCountWorker → ReceiveCountWorker → FinishCountWorker

 ただし、そのためには、最終的には、WorkManagerのキューに登録する必要があります。それが、(8)のWorkContinuationオブジェクトのenqueue()メソッドの実行です。

 なお、リスト1やリスト2の(5)〜(8)は、その仕組みを紹介するためにそれぞれ別の行として記述しています。これらは、メソッドチェーンを採用して、次の1行記述でも問題なく動作します。公式ドキュメントでは、このコードパターンで紹介しています。

workManager
  .beginWith(createCountWorkRequest)
  .then(receiveCountWorkRequest)
  .then(finishCountWorkRequest)
  .enqueue();

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
ワークチェインにおけるワーカーの状態

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
一歩進んだAndroidアプリ開発ができる「Android Jetpack」入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20048 2024/08/30 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング