どうも、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リクエストを書くとこんな感じです。
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を使って書くと以下のようになります。
public class SampleEvent
{
// イベントクラスには非同期処理の結果などを保持させておく
private boolean mResult;
public SampleEvent(boolean result)
{
this.mResult = result;
}
public boolean getResult()
{
return this.mResult;
}
}
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);
}
});
}
}
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