ASとか

開発系の記事が多めです。タイトルのASはActionScriptの略です。

Volley 読んだ

はじめに

出遅れた感が凄いけど Google がリリースした Android 用の通信ライブラリである Volley を読んだ。今のプロジェクトの通信部分はかなり軽量で、それはそれでいいんだけど、気を利かせて書くとこうなるっていう指標を知りたくて、その目標は達成できたと思う。

準備

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

commit id は faa2a13dce6f8a1022e7cd9f04cdd75bfd280746 です。

ポイント

参考にした記事にある全体の図が凄いわかりやすいので、これである程度詳細まで掴める人も多いと思います。ここにはコード読んでる時に書いたメモを小綺麗にして残しておきます。

com.android.volley.Request

  • public Request(int method, String url, Response.ErrorListener listener)
    • 通信方式、URL、エラー時のコールバックオブジェクトを受け取る
    • その他のもの(成功時のコールバッックオブジェクトとか)はサブクラスでコンストラクタ拡張して受け取る
  • abstract protected Response parseNetworkResponse(NetworkResponse response)
    • NetworkResponse から JsonObject なりの形にして Response に含めて返す

com.android.volley.RequestQueue

  • public RequestQueue(Cache cache, Network network, int threadPoolSize, ResponseDelivery delivery)

    • このクラスが Volley のコア部分を稼働させるので、キャッシュ方式、通信方式、使用する側へのコールバック方式、あと並列で通信にいくスレッドの本数という、重要なところは全てコンストラクタで受け取る
    • それぞれ奇麗にインターフェースが定義されているので、既に用意されている実装クラスを見るともの凄い少ない労力で置き換えができる
  • public void start()

    • CacheDispatcher と、指定数分(コンストラクタで受け取った threadPoolSize)の NetworkDispatcher を稼働させる
    • 各 Dispatcher には参照する必要があるメンバの Queue と、コンストラクタで受け取ったものを渡しておく
  • public Request add(Request request)

    • キャッシュを使う必要が無ければ mNetworkQueue、必要があれば mCacheQueue に追加する
  • private final PriorityBlockingQueue mCacheQueue;

    • RequestQueue によって追加され、CacheDispatcher が処理していく Queue
  • private final BlockingQueue mNetworkQueue;

    • RequestQueue or CacheDispatcher によって追加され、NetworkDispatcher が処理していく Queue

com.android.volley.CacheDispatcher

  • public void run()
    • 無限ループしつつ RequestQueue.mCacheQueue を処理していく。キャッシュが無い、あるいは更新が必要であった場合に通信を行わせるよう RequestQueue.mNetworkQueue に追加したりもする
    • キャッシュがあった場合は RequestQueue から受け取った ResponseDelivery に渡す

com.android.volley.NetworkDispatcher

  • public void run()
    • 無限ループしつつ RequestQueue.mNetworkQueue を処理していく。Network インターフェースの実装クラスを叩いて通信を行うのはここ
    • 通信を行って得たレスポンスは RequestQueue から受け取った ResponseDelivery に渡す

com.android.volley.ExecutorDelivery

  • public ExecutorDelivery(final Handler handler)
    • 受け取った Handler に post する Executor を作成して保持しておく
  • public void postResponse(Request<?> request, Response<?> response, Runnable runnable)
  • public void postError(Request<?> request, VolleyError error)
    • 引数で ResponseDeliveryRunnable を作成して Executor に渡す

com.android.volley.ExecutorDelivery.ResponseDeliveryRunnable

  • ResponseDeliveryRunnable(Request request, Response response, Runnable runnable)
    • 最後にコールバックされる Request、コールバック関数の引数として渡す Response、更新予約の実行等、コールバック後に実行してほしい Runnable を受け取り保持しておく
  • public void run()
    • Request へのコールバックや終了処理呼び出し、あれば Runnable を実行しておく

おわりに

Cache とか Network だとかはインターフェース以上のことを説明できなさそうだったので省いてあります。もし読んでみようということになったらとりあえず Volley.newRequestQueue() を見てそこから辿っていくのがよいかなと思います。