使ってよかったAndroidライブラリ

どうも、kouhonです。日付ギリギリですいません。
今回は今までのAndroidアプリ開発で使ってみて、良かったライブラリをいくつか紹介したいと思います。
~~ホントはKotlinのこと書こうと思ってましたが、間に合いませんでした。ごめんなさい。~~
# OkHttp
以前はGoogle純正の[Volley](https://android.googlesource.com/platform/frameworks/volley/)を使っていましたが[OkHttp](http://square.github.io/okhttp/)に切り替えました。
切り替えた理由は以下の通りです。
##1. Volleyが依存しているライブラリが削除されたから。
致命的ですね。Volleyは「Apache HTTP client」に依存していますが、Android API level 22で「Apache HTTP client」はdeprecatedになってしまいました。
しかも、Android6.0(Android API level 23)では削除されてしまいました。
クックパッドさんもブログで「[Volleyの採用は間違いでした](http://techlife.cookpad.com/entry/2015/06/25/093507)」と述べています。
##2. ライブラリがGradleで管理できない
今はAndroid Studioでの開発が主流です。ライブラリはGradleで管理したいです。
当然、OkHttpはGradleで管理できます。

##サンプル
JavaでOkHttpを使ってGetリクエストを書くとこんな感じです。

```lang:sample
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
                .url("http://hugahoge.com")
                .build();
client.newCall(request).enqueue(new Callback()
{
    @Override
    public void onFailure(Request request, IOException e)
    {
        // リクエスト失敗時の処理
    }
    @Override
    public void onResponse(Response response) throws IOException
    {
        // リクエスト成功時の処理
        // ステータスコードが200かどうか
        if(response.code() == 200)
        {
            // レスポンスが200(OK)だった時の処理
        }
        else
        {
            // レスポンスが200(OK)以外だった時の処理
        }
    }
});
```
#EventBus
非同期処理が増大するとリスナー地獄になることがありますが、EventBusはそれを解消してくれます。
リスナーよりもオブジェクトが疎結合に保たれ、簡潔なコードになります。
EventBusにはいくつか種類があり、私が知っている限りで3つあります。

- [Google Guava](https://code.google.com/p/guava-libraries/wiki/EventBusExplained)
- [square/otto](https://github.com/square/otto)
- [greenrobot](https://github.com/greenrobot/EventBus)

私は最初に使ったのが[greenrobot](https://github.com/greenrobot/EventBus)だったので[greenrobot](https://github.com/greenrobot/EventBus)を使っていますが[greenrobot](https://github.com/greenrobot/EventBus)はAndroidに最適化されているので問題なく使えます。

##サンプル
Javaで非同期リクエストをして、リクエスト結果をEventBusを使って書くと以下のようになります。

```lang:SampleEvent
public class SampleEvent
{
    // イベントクラスには非同期処理の結果などを保持させておく
    private boolean mResult;

    public SampleEvent(boolean result)
    {
        this.mResult = result;
    }

    public boolean getResult()
    {
        return this.mResult;
    }
}
```
```lang:SampleRequest
public class SampleRequest
{
    private static SampleRequest instance = new SampleRequest();
    public static SampeRequest getInstance() {return instance;}
    private SampleRequest(){}

    public void request()
    {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("http://hugahoge.com")
                .build();
        client.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Request request, IOException e)
            {
                // イベントオブジェクトを生成して、リクエスト結果を設定
                EventBus eb = EventBus.getDefault();
                SampleEvent event = new SampleEvent(false);
                // イベントを送信
                eb.post(event);
            }
            @Override
            public void onResponse(Response response) throws IOException
            {
                // イベントオブジェクトを生成して、リクエスト結果を設定
                EventBus eb = EventBus.getDefault();
                if(response.code() == 200)
                {
                    SampleEvent event = new SampleEvent(true);
                }
                else
                {
                    SampleEvent event = new SampleEvent(false);
                }
                // イベントを送信
                eb.post(event);
            }
        });
    }
}
```
```lang:SampleActivity
public class SampleActivity extends Activity
{
    private final EventBus mEventBus = EventBus.getDefault();
    ・
    ・
    ・
    @Override
    public void onResume()
    {
        super.onResume();
        /// イベントバスの登録
        this.mEventBus.register(this);
    }

    @Override
    public void onPause()
    {
        /// イベントバスの解除
        this.mEventBus.unregister(this);
        super.onPause();
    }
    ・
    ・
    ・
    // 非同期のリクエストを実行
    public void executeRequest()
    {
        SampleRequest.getInstance().request();
    }

    // イベントが送信されたらこのonEventがコールされる
    public void onEvent(SampleEvent event)
    {
        if(event.getResult())
        {
            // リクエストが成功した時の処理
        }
        else
        {
            // リクエストが失敗した時の処理
        }
    }
}
```
#Guava
Googleが提供している[ライブラリ](https://code.google.com/p/guava-libraries/)です。
コンセプトとしては「いつもやっていることを短く書くため」のライブラリです。
使った理由はCollections2のfilterを使ってみたかったからです。
java8ならラムダ式が使えますが、まだAndroidが対応しているのがjava7までのため使えません。
##サンプル

```lang
List<String> hugaHoge = Lists.newArrayList("huga", "hoge", "hugahoge"); 

Collection<String> resultCollection = Collections2.filter(
                hugaHoge, new Predicate<String>()
{
    @Override
    public boolean apply(PlaceEntity input)
    {
        return input.equals("hugahoge");
    }
});
resultCollection.size() // 1
```

##注意
Guavaをプロジェクトに取り入れた場合にGuavaのメソッド数が多いためdexファイル（実行ファイル）のメソッド制限数(65535)に引っかかる場合があるので注意が必要です。
対応策としてはgradleのdependenciesに必要なもののみを追加するように設定し直すか、またはmulti-dexを使ってdexを拡張する方法があります。

#support-annotations
これもGoogleが提供している[ライブラリ](http://tools.android.com/tech-docs/support-annotations)です。
主に使ってたので@NonNullです。

```lang:サンプル
public void huga(@NonNull String hoge)
{
   何かしらの処理
} 
```

上記のように書くと例えばhuga(null)と記述すると警告してくれます。
これにより、null例外を軽減することが出来ます。
@NonNull以外にも@UIThreadや@WorkerThreadなどのスレッド系のアノテーションや@FloatRangeや@IntRangeなど値の範囲のアノテーションなど様々なアノテーションが追加されたので上手に使っていきたいですね。

簡単でしたが今回はこの辺でm(_ _)m
kotlinについては[技術ブログ](http://tech.actindi.net/)で書こうと思います。

#最後に
***アクトインディでは[エンジニアを募集](http://www.actindi.com/recruit/programmer)しています！！！***
もちろん、スマフォアプリエンジニアも募集しています！！！
[Androidアプリをつくりたい！250万組の親子を笑顔に！！](https://www.wantedly.com/projects/15947?ql=gaJpZM4AFTUI)
[iOSアプリをつくりたい！250万組の親子を笑顔に！！](https://www.wantedly.com/projects/913?ql=gaJpZM4AFTUI)

#参考ページ

[OkHttp](http://square.github.io/okhttp/)
[Google Guava EventBus](https://code.google.com/p/guava-libraries/wiki/EventBusExplained)
[square/otto](https://github.com/square/otto)
[greenrobot](https://github.com/greenrobot/EventBus)
[Google Guava](https://code.google.com/p/guava-libraries/)