ロボット研究開発、ソフトウェア開発、コンテンツ制作配信

【Androidアプリ(java)】シンプルな天気予報アプリを作る(非同期処理)


どうもこんにちは、
Androidアプリ(java)で簡単な天気予報アプリを作ってみました。
天気情報は、以下の天気予報APIを使います。
天気予報API

完成形のソースは、Githubにアップしました。
Github(weather_simple)

スポンサーリンク

動画解説

動画解説もあります。記事と合わせてどうぞ!

今回作るアプリ

画面上部に、都市を選択するスピナーを配置します。
都市を選択し、「今日の天気は?」ボタンを押すと、その都市の今日の天気を表示する簡単なアプリです。

レイアウト

まずは、画面のレイアウトを実装します。
activity_main.xmlを以下のように実装します。

都市選択スピナーを実装する

まず初めに、都市選択スピーナーを実装します。
今回使う天気予報APIでは都市ごとにIDが割り振られており、URLの末尾にIDを指定することで都市の天気情報を取得することができます。

都市のIDは、以下から確認できます。
天気予報API(都市ID)

URL+都市のID
例:以下福岡市の天気(400010が福岡市のID)
https://weather.tsukumijima.net/api/forecast/city/400010

ではMainActivityにスピナー処理を追加していきましょう。
まず、都市のIDを管理するため、HashMapで都市名をキーにしてIDを追加します。
※とりあえず、福岡〜熊本を追加しましたが、好きな都市を自由に追加してください。

次にスピナーの設定です。
HashMapのcity_mapからキーの配列を取得し、citiesに設定します。
あとは、adapterを作ってスピナーにセットしてあげます。

スピナーでアイテムが選択されたときのリスナーを実装します。
アイテムが選択されたら、その都市名を選択地:横のtextViewに設定します。

非同期処理で天気予報情報取得処理を実装する

普段描画などを処理しているUIスレッドで天気予報APIを使った通信処理を行うと、描画処理が待たされて問題が発生します。

従って、通信処理などの時間がかかる処理は、UIスレッドではなく、別のバックグラウンドスレッドなどで実行する必要があります。これを非同期処理といいます。

バックグラウンド処理を実装するには、まずRunnnableインタフェースを実装したクラスを作り、ExecutorServiceで実行します。
今回は、Runnnableを実装した”WeatherInfoRecevier”というクラスを作成しました。

補足:
・Runnnable:Javaインタフェース バックグラウンドで処理させたいことをrun()に実装する
・ExecutorService:スレッド管理クラス バックグラウンド処理でタスク制御するときに使う

以下のように、”WeatherInfoRecevier”という新規Java Classを作成します。

コンストラクタでは、天気予報APIで必要な都市ID、結果を表示するためのtextView(telopとdescription)を引数で設定します。
run()メソッド内にバックグラウンド処理を記載します。
doInBackground()メソッド内で天気予報APIのURLへアクセスし、情報を取得します。
取得結果はStringで返します。

最終的に、取得した結果を画面に描画したいので、バックグラウンド処理からUIスレッドに結果を渡します。
handlerを使って、postすれば、メッセージがキューイングされUIスレッドで処理が実行されます。
具体的には、onPostExecute()メソッドがUIスレッドで行う結果表示処理です。
onPostExecuteでは、天気予報APIから取得した結果のjson形式を解析し、JSONからtelop情報とdescription情報を取得しtextViewに設定しています。

作成したWeatherInfoReceiverクラスは、MainActivity側からボタンを押したときに、ExecutorServiceを使って実行します。

ボタン処理を実装する

MainActivityに、「今日の天気は?」ボタンの処理を実装します。
onCreate内に以下を実装しましょう。

ボタンが押されたら、選択している都市名を取得し、city_mapから都市名に関連するIDを取得します。(9行目)
ExecutorServiceのsubmitメソッドで、WeatherInfoReceiverのインスタンスを指定しバックグラウンド処理を実行します。(10〜11行目)

マニフェストに権限を追加する

WebAPIを使うため、Androidのマニフェストファイルにインターネット接続に関する権限を追加します。
AndroidManifest.xmlに以下を追記します。

実行してみる

一通り実装が終わったら、アプリをインストールして実行してみます。
以下のように各都市の今日の天気が取得できました!

最後に

Androidアプリに通信機能など搭載していくと必ず非同期処理が必要になってきます。
シンプルな天気予報アプリで非同期処理の実装にチャレンジしてみてください。
それでは!

スポンサーリンク

いいね!を押すと、
最新記事をお届けします。

Twitter で
関連記事(一部広告含む)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


ページトップボタン