前回はフラグメントを扱いました。
前回までのサンプルでは、Android端末がインターネットにまったく接続されていなくても動作するものでした。しかし、スマートフォンやタブレットの真骨頂は、やはりインターネットに接続し、外部サービスとデータのやり取りをしてこそです。そこで、今回はライブドアの天気情報からデータを取得し、表示するサンプルを作成しつつ、AndroidのWeb API連携の方法を解説していきます。
本連載の書籍化について(2018年5月追記)
本連載は、加筆・再構成およびAndroid Studio 3対応を行い、書籍化しています。最新情報については、こちらもぜひ併せてご参照ください。
対象読者
- Androidアプリ開発未経験な方
- Java言語は一通り習得済みである方
非同期処理
実際のサンプル作成に入る前に、クラウド連携で必須の考え方である非同期処理について解説していきます。まず、下図を参照してください。
この図は、メソッド同士の連携を図式化したものです。左側のメイン処理が処理の中心であり、その中でメソッドgetData()とputData()が順に呼び出されている様子を表しています。Javaでは処理の一連の流れを「スレッド」という言葉で表し、メイン処理がひとつ開始されると、スレッドがひとつ起動することになります。そして、そのメイン処理からいくつメソッドを呼び出しても、それは同じスレッド上で実行される仕組みを取っています。
ここで大切なことは、同一スレッド上で、あるメソッドから別のメソッドを呼び出した場合、そのメソッドの処理が終了するまで、元のメソッドの処理は待ち状態となることです。図1でいえば、メイン処理でgetData()を呼び出し、処理がgetData()に移ります。そして、getData()の処理が終了し、メイン処理に戻るまでの間、メイン処理は待ち状態となるのです。putData()に関しても同じです。
この時、getData()メソッドが時間のかかる処理だとしたらどのような状態になるかを想像してみてください。当然メイン処理はずっと待ったままとなります。もし、メイン処理が画面表示処理なら、そのアプリを使用しているユーザーからは、画面の表示途中で処理が止まっているように見えるため、フリーズしたものと勘違いします。このような状況は避ける必要があります。
そこで、下図のようにスレッドを分離します。
getData()はメイン処理とは切り離して処理を開始し、メイン処理ではgetData()の戻りを待たずに次の処理に移ることができます。このような、処理の開始方法を「非同期処理」といいます。
そして、インターネットにアクセスしてデータを取得する処理のように、処理に時間がかかるもの、予期せぬエラーが起こりそうなものというのは非同期処理で行うのが鉄則なのです。
Javaではスレッドを分離するにあたり、ThreadクラスやRunnableインターフェースを使う方法がありますが、Androidの場合は、非同期処理専用のクラスとしてAsyncTaskという便利なクラスが存在します。サンプルを作成しつつ、このクラスの使い方を見ていくことにしましょう。
[Note]UIスレッド
Androidアプリで一番中心となるスレッドはActivityが実行される画面スレッドです。そして、このスレッドのことを「UIスレッド」といいます。