19
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

アクトインディAdvent Calendar 2015

Day 21

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

Last updated at Posted at 2015-12-21

どうも、kouhonです。日付ギリギリですいません。
今回は今までのAndroidアプリ開発で使ってみて、良かったライブラリをいくつか紹介したいと思います。
ホントはKotlinのこと書こうと思ってましたが、間に合いませんでした。ごめんなさい。

OkHttp

以前はGoogle純正のVolleyを使っていましたがOkHttpに切り替えました。
切り替えた理由は以下の通りです。
##1. Volleyが依存しているライブラリが削除されたから。
致命的ですね。Volleyは「Apache HTTP client」に依存していますが、Android API level 22で「Apache HTTP client」はdeprecatedになってしまいました。
しかも、Android6.0(Android API level 23)では削除されてしまいました。
クックパッドさんもブログで「Volleyの採用は間違いでした」と述べています。
##2. ライブラリがGradleで管理できない
今はAndroid Studioでの開発が主流です。ライブラリはGradleで管理したいです。
当然、OkHttpはGradleで管理できます。

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

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つあります。

私は最初に使ったのがgreenrobotだったのでgreenrobotを使っていますがgreenrobotはAndroidに最適化されているので問題なく使えます。

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

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

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

    public boolean getResult()
    {
        return this.mResult;
    }
}
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);
            }
        });
    }
}
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が提供しているライブラリです。
コンセプトとしては「いつもやっていることを短く書くため」のライブラリです。
使った理由はCollections2のfilterを使ってみたかったからです。
java8ならラムダ式が使えますが、まだAndroidが対応しているのがjava7までのため使えません。
##サンプル

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が提供しているライブラリです。
主に使ってたので@NonNullです。

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

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

簡単でしたが今回はこの辺でm(_ _)m
kotlinについては技術ブログで書こうと思います。

#最後に
アクトインディではエンジニアを募集しています!!!
もちろん、スマフォアプリエンジニアも募集しています!!!
Androidアプリをつくりたい!250万組の親子を笑顔に!!
iOSアプリをつくりたい!250万組の親子を笑顔に!!

#参考ページ

OkHttp
Google Guava EventBus
square/otto
greenrobot
Google Guava

19
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?