ダウンロード サンプルファイル (292.6 KB)
サンプルアプリの基本部分
Open Weatherの仕様が理解できたところで、サンプルアプリの作成に入っていきましょう。
サンプルアプリの概要
今回作成するサンプルアプリは、起動すると、図3の左側の画面が表示されます。
上部に都市名のリストが表示されており、その都市名をタップすると、図3の右側のように天気情報が表示されるようになります。この時、非同期でOpen WeatherのWeb APIサービスにアクセスし、レスポンスデータとしての天気情報JSONを取得します。ここまでがワーカースレッドでの動作になります。その後、UIスレッドでJSONデータを解析し、表示させるようにします。
なお、都市リストとしては、筆者在住の近畿圏の都市としていますが、適宜変更していただいてもかまいません。
基本部分はスケルトンアプリを活用
そのようなアプリを作成するにあたり、まずは、非同期でWeb APIサービスにアクセスする処理コードとJSONデータの解析コードを記述する前段階までの部分を作成する必要があります。それらのソースコードをここに掲載するには、紙面が足りません。そこで、あらかじめスケルトンプロジェクトを用意しています。ダウンロードサンプル中の「AsyncJavaSample-Skeleton.zip」が該当します。解凍の上、Android Studioで読み込んで、一度エミュレータなどでアプリを実行してみてください。図3の左の画面が表示されます。ただし、リストをタップしても、何も動作しないように見えます。
このプロジェクトにコードを記述する形で、以降解説を行なっていきます。
その前に、まず既存のソースコードでポイントとなるところを説明しておきます。
Web APIアクセス用URL生成ロジック
MainActivityのフィールドにリスト1の定数があります。
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のようになっています。
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に記述しておく必要があります。こちらも、スケルトンプロジェクトにはあらかじめ記述しています。
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
この記事は参考になりましたか?
- 2020年版Androidの非同期処理連載記事一覧
-
- KotlinによるAndroidの非同期処理
- AndroidアプリでのHTTPアクセスとJSONデータ処理
- JavaによるAndroid非同期処理の基本
- この記事の著者
-
WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 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本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
