Home

throw Life

Volley(AndroidのHTTP通信ライブラ)を使おう

DevFest Japan 2013 Google I/O 報告会

先日、「DevFest Japan 2013 Google I/O 報告会」で講演してきました。
報告会は短時間にダイジェストを届ける形で行われました。
気になるところがあればあとで資料やYoutubeを見て理解を深めて頂く趣向です。

そのためAndroidは30分しかない発表時間で130ページの膨大な資料をExpertの3人が作りましたので参考にして下さい。
講演資料

フォローアップ

アンケートではもう少し詳しくじっくり聞きたいというご意見も多数あったので、
本エントリーではフォローアップとして私が重要と思われる内容を詳しくお伝えします。
特に私のパート「Android Performance」についてです。

Volleyを使おう

HTTPを使ってインターネットと通信を行うAndroidアプリは一般的だと思います。
通信を非同期化するためAsyncTaskを利用することが殆どでしょう。

サンプルアプリ

画像とそのタイトル、説明文が並ぶタイムライン的なアプリをサンプルとします。

image

JSON形式のデータを取得します。JSONデータにはタイトル、説明文と画像の場所を示すURLが含まれています。

AsyncTaskを使った実装案
  1. はじめにJSONデータを取得するためにAsyncTaskのdoInBackgroundでHTTP通信を行い取得します。
  2. onPostExecuteで取得したJSONをパースしてタイトル、説明文をTextViewに設定します
  3. 画像URLを再びAsyncTaskのdoInBackgroundでアクセスします。
  4. 取得したInputStreamからBitmapを作成しImageViewに設定します。
  5. 画像の分だけ3,4を繰り返します。

ぱっと思いつく感じの実装案です。
これの問題点は何でしょうか?

AsyncTaskを使った問題点

HTTPリクエストの順番
リクエストの優先準備が変更できません。今表示されている領域の画像が一番重要なのに、この方法ではリクエスト順にしか画像が取得できません。

Froyo互換
HTTPリクエストはAndroidのバージョンごとに不具合に悩まされる種です。Apache HttpClientを使うべきなのかHttpUrlConnectionが適切なのか。
Froyo以下はHttpClientを利用し、Gingerbread以上ではHttpUrlConnectionを使うのが正解ですが…。面倒です。

キャッシュされない
アイコン画像など同じデータとしてもキャッシュを組まない限り毎回アクセスしてしまう。またアプリを開き直した時もキャッシュが無ければ全て取得しなおしです。

これらの課題を解決してくれるのがVolleyです。しかも実装が簡単、すごく便利です。

Volleyの実装例

すごくシンプルでコード量も減ります。

まずHTTPリクエストを行うQueueを作ります。

mQueue = Volley.newRequestQueue(context);

あとはリクエストを投げます。

request = new JsonObjectRequest(Method.GET, rul, null, 
                   new Listener<JSONObject>() {
                       public void onResponse(JSONObject jsonRoot) {
                           List<Item> items = parseJson(jsonRoot);
                           appendItemToList(items);
                       }
                   });
mQueue.add(request);

mQueue.add()メソッドでリクエストを設定するだけで後は自動でHTTPアクセスし完了するとListenerがcallbackされます。シンプルです。
画像を取得する場合はJsonObjectRequestの代わりにImageRequestを利用します。

非情に簡単ですね。画像取得についてはもっと簡単にできます。
com.android.volley.NetworkImageViewというImageViewの拡張クラスが準備されています。

mNetImageView = (NetworkImageView)findViewById(R.id.netImg);
mNetImageView.setImageUrl(url, imgLoader);

たった2行で完了です。すごく便利です。
ちなみにこれらの画像リクエストは全部キャッシュされていますので二回目以降のアクセスはディスクにキャッシュされた画像を取得するため高速です。

もちろんキャッシュさせないリクエストも可能ですし、キャッシュ量の制限も可能です。
HTTPリクエストの優先順位を変更したい場合は、Request.setSequence(int)というメソッドなどで順番を設定、変更できます。

VolleyのDebug&Trace

なにか不具合あった時にもデバッグしやすくなっています。
adbコマンドを使いましょう。

adb shell setprop log.tag.Volley VERBOSE
Volleyの始め方

プロジェクトをgitしてきましょう。

git clone http://android.googlesource.com/platform/frameworks/volley

そのコードを自分のアプリプロジェクトに組込むだけです。
サンプルプログラムを準備しましたので興味があれば御覧ください。

Github adamrocker/volley

Volleyの拡張

Volleyは拡張性が高いのも特徴です。@zaki50さんが早速SPDY通信する拡張を作っていました。

NetworkImageLoaderのサンプルアプリを@daichan4649さんが公開されています。

おわりに

VolleyいいよVolley!すごく便利だよ。実装ラクだよ。みんな使おうよ。GooglePlayでも使われているらしい発言が発表であったよYoutube。安心して使えますね。

本エントリはここまで。続きはつぎのエントリで。

Home

Author
Search
Feeds
Meta

Return to page top