Androidの非同期通信処理

Android書いてますか?

これなに

2013年10月13日あたりに流行ってそうな,Android非同期通信処理方法のススメを,Android非同期通信何それ?な人に向けて簡単に情報をまとめる
Android普段全く書いてないけどここ数日少し調べた自分が知識の共有のために残す
また将来的には流行りは変わるので今しか使えない

転用ばかりで申し訳ない感じなので日常的にAndroid開発してる方はお帰りください
最低限動かすための,すぐに動かすための情報しか書いてないので良くない情報もある

Androidでの非同期通信処理

サーバとの通信を行う際に記述しなければならない処理.Androidではメインスレッド上で通信を行う事が出来ないため,サーバとの通信を行うには非同期スレッドを立てなければならない.

昔の処理

Android2.x時代はメインスレッドに直接処理を書けたらしい
非同期処理にしなければならくなった際に出たのがAsncTask

もうAsyncTaskを使う理由は全く無くなったと言っても過言では無い

今の処理

AsyncTaskLoadervolleyの2つの方法が主流だろう.どちらも良い感じ.

これら2つについて,軽くポイントを抑えると以下な感じ

  • AsyncTaskLoader
    • Android3.0以上で使える機能
    • support library*1を使えばもちろん2.xでも使える
    • メインの通信処理はAsyncTaskLoaderを継承した独自クラスの中で行わせる必要があるため,自分で書くかまた別の実装が必要になる
    • CallBackは呼び出す側でLoaderCallbacksを実装する事で良い感じに定義可能
  • volley
    • Goggleが目下開発中のネットワーク周りライブラリ
    • 基本的な通信処理はRequestとして予め用意されているので,詳しく書きたければこれを継承させて用いる
    • 簡単な処理を行う際には,非同期処理を行うための別クラスを作成する必要が無い
    • 画像キャッシュ良い感じだし,リクエストを複数投げるのに向いてる

どうすればすぐに使えるか,軽く順に紹介する.
と思ったけど良い記事たくさんあるから,リンク張りながらコメントする.

AsyncTaskLoader

1年以上前の記事といった表示がされているが,AsyncTaskLoaderを使ってみる | Developers.IOはそのまま使えるコードが置いてあるし,AsyncTaskLoaderの動作イメージは参考になる.
こちらにあるHttpUtil.getBitmapHttpService(context, url)といった処理が実際の通信処理になるため,適宜別の実装が必要である.基本的にはorg.apache.httpを使えば書ける.
Android2.xで使う場合にはsupport.v4に含まれているものを使う.
具体的には,以下な感じでsupportの方を使うのが良いだろう.もちろんLoaderCallbacksにもsupportライブラリに含まれているものを使う必要がある.

// 3.0以上でしか使えない
import android.content.AsyncTaskLoader;
// support.v4を使っているため2.xでも使える
import android.support.v4.content.AsyncTaskLoader;

最低限の要点だけ抑えてしまうと,以下の2つのクラスの実装が必要だ

  • AsyncTaskLoaderの継承クラス
    • 通信処理の返り値の型を明示する
    • コンストラクタで初期化する
    • loadInBackgroundをoverrideして通信処理を書く
  • LoaderCallbacksの実装クラス
    • 新しく非同期処理のLoaderを作成した時に行うProgressBarを表示するなどの処理をonCreateLoaderをoverrideして書く
    • Loaderの終了時にはonLoadFinishedが呼ばれるため,こちらには例えば取得した画像を描画する,ProgressBarを閉じるといた処理を書く

これ以外にもoverride出来る関数はあるので,必要に応じてAsyncTaskLoader | Android DevelopersLoaderManager.LoaderCallbacks | Android Developersを参考にすれば良いだろう.

volley

今使ってる.何をしてて,何が出来るんだ,といった解説記事はネットワーク通信用ライブラリVolleyを使いこなす | Tech Boosterが非常に参考になる.

volleyを使う最低限の要点は以下のような感じになる

  • 呼び出しを行うクラス
    • 通信処理(Request)を貯めこむRequestQueueを用意する
    • Requestのインスタンスを用意してqueueに追加することで通信が行われる
    • インスタンス生成時に,通信成功時,失敗時のCallBackを引数に与える
  • Request
    • 用意された色々なRequestを使っても良いし,良い感じに拡張するのも良い*2

良い感じに拡張するってなんだろう,みたいな感じだが,例として皆大好きjsonをgoogle-gson*3を使って特定のクラスにマッピングしたものを返すリクエストを作ると,このような感じ*4になる.先のリンクには使用例も書いた.RequestQueueという名前がどんどんRequestを投げ込んでくれ!といった思考植え付けられる感じで良い.

volleyを使うには...?

Android アプリ用ライブラリ Volley を準備する - ひだまりソケットは壊れないに書いてある.

library moduleとして取り込むのも良いが,てっとり早いのはjarって使うプロジェクトのlibsに入れる事だろう*5
その場合には以下の3つのステップを踏めば良い

  1. git clone https://android.googlesource.com/platform/frameworks/volley
  2. eclipse等でcloneしたプロジェクトを開き,Export->java->jarでvolleyのsrcのみチェックして,書き出すjarを指定してok
  3. 使う側のlibsに出来たjarを入れる

正直な所volley目下開発中だし,プロジェクトをlibraryとして取り込む方が良いし,上の方法おすすめしない.

ほげほげ〜

色んな記事がある.また増やしてしまったの世間的一般に申し訳ない.

後もう1つ気になるものがあって,AndroidAnnotationsで@backgroundとかくと非同期処理になるっぽいし,すごそう.でもブラックボックス過ぎて正直怖すぎる.

*1:3.0以上の機能を2.xなどでも使えるようにするライブラリ

*2:書き方最悪っぽい

*3:いずれ使いたくなる便利ライブラリ

*4:参考: https://gist.github.com/ficusk/5474673

*5:ただし内容が固定されてしまうのであまり良くない