声に出して読みたい Android のライブラリ - その1

[声に出して読みたいObjective-Cのライブラリ8種(2014.7)](http://qiita.com/hayashi311/items/85f62d98f05bee23a312) に触発されて書いてみます。

---

今回は Square 社製ライブラリを見ていきます。

# [Picasso](https://github.com/square/picasso/)

https://github.com/square/picasso/

安心と信頼の Square 社製のライブラリです。画像のローディングとキャッシュについて面倒を見てくれますが、画像の加工についても扱っています。

`Context`、多くの場合`Activity`のライフサイクルに合わせて画像の読み込みを管理したり、`AdapterView`の中にあっては、`View`のリサイクルをハンドリングして、画像のロードをキャンセルしたりもしてくれます。

`Transformation`インタフェースを実装し、そのロジックを渡すことで、画像の加工もできます。

処理の始まりは`Picasso`クラスから。`Picasso#with(Context)`で自動的にオブジェクトの初期化がはじまり(まだの場合)、続けてどこから画像を読み込むかや、プレースホルダの設定、加工処理の有無などの`Request`オブジェクトの生成を経て(`RequestCreator`)、最終的に、同期的に`Bitmap`を取得するか、非同期的に`Bitmap`をどこかにアサインするかを`get()`または`into(Target)`、`into(ImageView)`を呼び出すことで、リクエストが始まります。

`Picasso`自体もビルダが用意されており、アプリごとにキャッシュサイズの変更などといった設定を変えることができます。

使い方は[こちら](http://qiita.com/hotchemi/items/33ebd5faa42d2d05c2b6)が詳しいです。

# [Dagger](https://github.com/square/dagger)

https://github.com/square/dagger

安心と信頼の Square 社製のライブラリです。Google も注目している DI コンテナで、Guice のように実行時に依存グラフを解決するのではなく、コンパイル時に依存グラフを解決するのが特徴です。

フィールドインジェクション、コンストラクタインジェクションに対応しており、JSR-330 で定義されたアノテーション(`javax.inject.Inject`、`javax.inject.Singleton`、`javax.inject.Named`など)を用いるため、他の DI コンテナからの移行も難しくありません。

依存関係を宣言するのは`@Module`アノテーションが付与されたクラスです。このクラスで宣言された依存関係を元に、オブジェクトの注入をするのは`ObjectGraph`クラスです。

# [Retrofit](https://github.com/square/retrofit)

https://github.com/square/retrofit

安心と信頼の Square 社製のライブラリです。REST クライアントを生成する、ボイラプレートなコードをまとめて管理してくれます。

REST リクエストを飛ばしてレスポンスを得て、Entity の型へ変換するまでの面倒を見てくれます。開発者は、REST のエンドポイントと、リクエストを投げる際に呼び出すメソッド、返り値の型を `interface` として宣言し、`RestAdapter#create(Class<?>)`にそのインタフェースのクラスクラスを渡すだけで、REST クライアントが完成します。あとは、インタフェースに定義したメソッドを呼び出すだけで、必要な処理が実行され、レスポンスを得ることになります。

エンドポイントごとの設定は、アノテーションによって実現できます。例えば、`POST`や`GET`などのメソッドの設定はそれぞれアノテーションが用意されていますし、HTTP ヘッダもアノテーションによって宣言することができます。

この他、`RestAdapter`がすべての設定を管理しているので、このオブジェクトに好きな設定を渡すことで、振る舞いを変えることもできます。

使い方は[こちら](http://qiita.com/tsuyosh/items/7d38f41b2cfb4a6ae24b)。

# [otto](https://github.com/square/otto)

https://github.com/square/otto

安心と信頼の Square 社製のライブラリです。Guava にある EventBus を元に、Android 向けの拡張のあるものです。

`Bus`クラスが中心となり、様々なクラスがコミュニケーションをとるためのインタフェースを提供しています。

コミュニケーションを発信する側は、`Bus#post(Object)`を用いて、発信に使うオブジェクトを渡します。

コミュニケーションを受信する側は、`Bus#register(Object)`で受信の準備をし、`Bus#unregister(Object)`で受信を取りやめることができます。Android の場合、`Activity`や`Service`などライフサイクルがあるコンポーネントが多く、ライフサイクルが終わるタイミングで`Bus#unregister(Object)`をすることになります。

よく、コールバックインタフェースの代替として用いられます。モデルに非同期な処理を依頼し、その結果をイベントとして受け取ったり、UI で起こる各種のイベントを通知するために使ったりします。

インタフェースによる、直接の依存関係がなくなることで、モジュールの切り替えが容易になる一方で、インタフェースを定義して型による実装の強制が無くなるので、実装漏れがあってもコンパイル時に気が付けないという面があります。

使い方は[こちら](http://qiita.com/KeithYokoma/items/793aaac6994c9242808f)が詳しいです。

# [okhttp](https://github.com/square/okhttp)

https://github.com/square/okhttp

安心と信頼の Square 社製のライブラリです。

HttpUrlConnection 等のような低レイヤな部分のライブラリで、Http 通信に関する部分の面倒をよく見てくれます。また、SPDY にも対応しています。

よくある問題として、コネクションの確立がうまくいかない場面があります。この時、okhttp では、自動的に代替となる接続先へと切り替えてくれます。

また、通信に関して、キャッシュを活用した通信回数の削減や、GZIP 圧縮、コネクションプールを活用して遅延を削減するなどの工夫も含まれています。

最近では、Android L Preview にも okhttp が使われていることが判明し、Google も注目しているようです(おもいっきり[事故っていましたが…](https://github.com/square/okhttp/issues/967))。

使い方は[こちら](http://qiita.com/ryugoo/items/478ba23cda0f57bd21e8)が詳しいです。