SHOEISHA iD

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

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

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

バックグラウンド処理を管理しよう! WorkManagerの応用的な使い方を解説

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

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

 本連載は、「Android Studio2で始めるアプリ開発入門」連載、および『Androidアプリ開発の教科書』の続編にあたる内容として、Jetpackを取り上げていきます。前回からは、バックグラウンド処理を管理できるWorkManagerを紹介しており、初回に当たる前回は、WorkManagerの概説と、その使い方の基本を紹介しました。今回は、その続きとして、応用的な使い方を紹介します。具体的には、ワーカーにデータを渡す方法や、再実行の制御、複数起動の制御、キャンセルを紹介します。

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

ワーカーにデータを渡す方法

 本連載は、Android Jetpackを紹介しています。前回から3回にわたって、WorkManagerを紹介しています。今回は、前回の続きとして、まず、ワーカーにデータを渡す方法を紹介します。

 サンプルデータは、GitHubから参照できます。

データを渡す仕組みの中心「setInputData()メソッド」

 前回紹介したサンプルでは、ワーカーはその起動元からデータをもらうことを前提にしていませんでした。もちろん、そのようなワーカーを利用する場合もありますが、起動元からデータをもらわないと処理が実行できない場合もあります。そのような場合にも対応できるように、WorkManagerにはワーカーにデータを渡す専用の仕組みが用意されています。

 まず、コードサンプルをみてみると、Javaではリスト1、Kotlinではリスト2のようなコードになります。このコードは、ワーカー側でループ処理を行う際に表示させるメッセージ文字列と、そのループ処理回数を渡すサンプルとなっています。ここで利用するワーカーであるReceiveCountWorkerでは、この2個のデータをもらって処理を行うことを前提としています。

リスト1:ワーカーにデータを渡す例(Java版)
Data.Builder dataBuilder = new Data.Builder();  // (1)
dataBuilder.putString("loopMsg", "こんにちは");  // (2)
dataBuilder.putInt("loopCount", 13);  // (3)
Data inputData = dataBuilder.build();  // (4)
OneTimeWorkRequest.Builder workRequestBuilder = new OneTimeWorkRequest.Builder(ReceiveCountWorker.class);  // (5)
workRequestBuilder.setInputData(inputData);  // (6)
WorkRequest workRequest = workRequestBuilder.build();  // (7)

リスト2:ワーカーにデータを渡す例(Kotlin版)
val dataBuilder = Data.Builder()  // (1)
dataBuilder.putString("loopMsg", "こんにちは")  // (2)
dataBuilder.putInt("loopCount", loopCount)  // (3)
val data = dataBuilder.build()  // (4)
val workRequestBuilder = OneTimeWorkRequestBuilder<ReceiveCountWorker>()  // (5)
workRequestBuilder.setInputData(data)  // (6)
val workRequest = workRequestBuilder.build()  // (7)

 JavaもKotlinも同じコードであり、ワーカーにデータを渡す仕組みの中心となるのが、(6)のsetInputData()メソッドです。これは、WorkRequestのビルダーのメソッドなので、(5)のコードで取得したビルダーオブジェクトに対してsetInputData()メソッドを実行して、データを渡します。そして、そのビルダーを元に(7)で生成したWorkRequestを利用して、WorkManagerのキュー登録を行えば、ワーカーの方ではデータを受け取れます。

 ただし、setInputData()メソッドを利用する場合は、あらかじめその引数であるandroidx.work.Dataオブジェクトを生成しておく必要があります。そのコードが(1)〜(4)です。これらのコードも、Dataオブジェクトをnewするのではなく、Dataオブジェクトを生成するビルダーのインスタンスを生成し、そのビルダーオブジェクトにデータをセットします。リスト1やリスト2では、(1)がビルダーオブジェクトを生成しているコードです。

 ビルダーを生成した次は、(2)や(3)のように、put〇〇()メソッドを利用してデータをセットします。この〇〇部分は、セットするデータ型でメソッド名が変わってきます。これらのメソッドの第1引数がデータを識別するキー文字列、第2引数がデータそのものです。

 このようにして、データをセットしたビルダーオブジェクトに対し(4)のように、build()メソッドを実行してDataオブジェクトを生成します。

ワーカー内でデータを受け取るコード

 次に、ワーカー側でデータを受け取るコードを見ていきましょう。これは、Javaではリスト3、Kotlinではリスト4のようになります。

リスト3:データをもらう例であるReceiveCountWorker(Java版)
public class ReceiveCountWorker extends Worker {
  :
  public Result doWork() {
    Data inputData = getInputData();  // (1)
    String loopMsg = inputData.getString("loopMsg");  // (2)
    int loopCount = inputData.getInt("loopCount", 30);  // (3)
    :
  }
}

リスト4:データをもらう例であるReceiveCountWorker(Kotlin版)
class ReceiveCountWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
  override fun doWork(): Result {
    val loopMsg = inputData.getString("loopMsg")  // (2)
    val loopCount = inputData.getInt("loopCount", 30)  // (3)
    :
  }
}

 Workerクラス(正確にはその親クラスであるListenableWorkerクラス)には、起動元から渡されたデータを取得できるgetInputData()というのが存在します。リスト3の(1)では、このメソッドを実行してDataオブジェクトを取得しています。

 その後は、(2)や(3)のように、get〇〇()メソッドを実行して、データを取り出します。前項で紹介したput〇〇()メソッド同様に、この〇〇は取得するデータ型でメソッド名が変わってきます。引数としては、取得するデータを識別するキー文字列、つまり、put〇〇()メソッドの第1引数と同じものを渡します。

 ただ、このget〇〇()メソッドは(2)のgetString()での文字列取得や、getIntArray()のような配列を取得するメソッド以外は、(3)のように第2引数としてデータが存在しない場合の初期値を渡す必要があるので、注意してください。

 なお、Kotlinコードでは、getInputData()メソッドの代わりにinputDataプロパティを利用します。そのため、リスト4の(2)や(3)のように、このinputDataプロパティから直接get〇〇()メソッドを利用してデータを受け取ります。

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

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

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

メールバックナンバー

次のページ
再実行の制御

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

  • 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/19853 2024/07/23 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング