SHOEISHA iD

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

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

2020年版Androidの非同期処理

AndroidアプリでのHTTPアクセスとJSONデータ処理

2020年版Androidの非同期処理 第2回

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

サンプルアプリの基本部分

 Open Weatherの仕様が理解できたところで、サンプルアプリの作成に入っていきましょう。

サンプルアプリの概要

 今回作成するサンプルアプリは、起動すると、図3の左側の画面が表示されます。

図3:サンプルアプリの画面
図3:サンプルアプリの画面

 上部に都市名のリストが表示されており、その都市名をタップすると、図3の右側のように天気情報が表示されるようになります。この時、非同期でOpen WeatherのWeb APIサービスにアクセスし、レスポンスデータとしての天気情報JSONを取得します。ここまでがワーカースレッドでの動作になります。その後、UIスレッドでJSONデータを解析し、表示させるようにします。

 なお、都市リストとしては、筆者在住の近畿圏の都市としていますが、適宜変更していただいてもかまいません。

基本部分はスケルトンアプリを活用

 そのようなアプリを作成するにあたり、まずは、非同期でWeb APIサービスにアクセスする処理コードとJSONデータの解析コードを記述する前段階までの部分を作成する必要があります。それらのソースコードをここに掲載するには、紙面が足りません。そこで、あらかじめスケルトンプロジェクトを用意しています。ダウンロードサンプル中の「AsyncJavaSample-Skeleton.zip」が該当します。解凍の上、Android Studioで読み込んで、一度エミュレータなどでアプリを実行してみてください。図3の左の画面が表示されます。ただし、リストをタップしても、何も動作しないように見えます。

 このプロジェクトにコードを記述する形で、以降解説を行なっていきます。

 その前に、まず既存のソースコードでポイントとなるところを説明しておきます。

Web APIアクセス用URL生成ロジック

 MainActivityのフィールドにリスト1の定数があります。

[リスト1]MainActivity.java
private static final String WEATHERINFO_URL = "https://api.openweathermap.org/data/2.5/weather?lang=ja";
private static final String APP_ID = "";

 このWEATHERINFO_URLがOpen WeatherのWeb APIサービスを利用するためのURLの基本部分です。また、APP_IDがAPIキーです。スケルトンコードでは、「""」と空文字となっていますが、ここに各自が取得したAPIキー文字列をコピー&ペーストしてください。

 次に、リストがタップされた時の処理が記述されたListItemClickListenerクラスのonItemClick()メソッド内の処理に注目しましょう。これは、リスト2のようになっています。

[リスト2]MainActivity.java
public void onItemClick(…) {
    Map<String, String> item = _list.get(position);
    String q = item.get("q");
    String url = WEATHERINFO_URL + "&q=" + q + "&appid=" + APP_ID;  // (1)

    asyncExecute();  // (2)
}

 リスト1で説明した定数WEATHERINFO_URLとAPP_IDと、さらにタップされたリストデータをもとに都市名を表す文字列qを使って、実際にWeb APIサービスにアクセスするためのURLの完全形を生成しているのが、(1)です。

非同期処理用のコードもあらかじめ記述されている

 さらに、リストをタップした際に非同期でWeb APIにアクセスするため、(2)の位置に非同期処理を開始するためのメソッドasyncExecute()を実行しています。このメソッドは、前回記述したasyncExecute()メソッドそのものです。さらに、このメソッド内の処理で実行するBackgroundTaskクラス、さらに、ワーカースレッドでの処理終了後にUIスレッドで処理を行うためのPostExecutorクラスも、そのままスケルトンプロジェクトに記述しています。確認してください。

 なお、スケルトンプロジェクト内のそのBackgroundTaskクラスには、is2String()メソッドが追記されています。こちらはInputStreamオブジェクトを文字列に変換する定型処理が記述されたメソッドであり、のちに利用しますのであらかじめ記述してあります。

HTTPアクセスの許可

 AndroidアプリがWebアクセスを行う場合、HTTPアクセスの許可として、リスト3の2行をAndroidManifest.xmlに記述しておく必要があります。こちらも、スケルトンプロジェクトにはあらかじめ記述しています。

[リスト3]AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

次のページ
AndroidによるHTTPアクセス

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
2020年版Androidの非同期処理連載記事一覧

もっと読む

この記事の著者

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/13233 2020/12/10 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング