TSUNAGU GROUP TECHNOLOGIES

TGT TechBlogTGT TechBlog

フロントエンドからバックエンドまでの技術ナレッジ

インディバルのAndroidアプリで使っている技術


はじめに
現在、インディバルでは私を含む2人のエンジニアでAndroidアプリの開発を担っています。
本記事では、[インディバルのAndroidアプリ]で使っている技術(主にライブラリ)の一部についてご紹介します。
ライブラリ
[Retrofit]
RetrofitはSquare社製のライブラリです。
AndroidのREST通信を担ってくれます。リクエストはアノテーションを使ってInterfaceに記述できます。

@リクエスト("パス")
Call<戻り値の変換Class> メソッド名(引数);
public interface ApiService {
// クエリパラメータを引数に渡す。
 @GET("hoge/path")
 Call<Hoge> getHoge(@Query("key1") String value1, @Query("key2") String value2);
// Map<key, value>でクエリパラメータを渡すこともできる。
 @GET("hoge/path")
 Call<Hoge> getHoge(@QueryMap Map<String, String> params);
// POSTする。
 @FormUrlEncoded
 @POST("hoge/path")
 Call<Hoge> sendHoge(@Field("key1") String value1, @Field("key2") String value2);
// POSTでもMap<key, value>で渡せる。
 @FormUrlEncoded
 @POST("hoge/path")
 Call<Hoge> sendHoge(@FieldMap Map<String, String> params);
}

呼び出し元はこんな感じになります。




// リクエストを生成する。
ApiService api = new Retrofit.Builder()
 .baseUrl("htt://hogehoge/") // URLを設定する。
 .addConverterFactory(GsonConverterFactory.create()) // Gsonを使用する。
 .build()
 .create(ApiService.class); // Interfaceから実装を取得する。
// パラメータを生成する。
Map<String, String> params = new HashMap<>();
...
// 実行する。
api.getHoge(params).enqueue(new Callback<Hoge>() {
 @Override
 public void onResponse(Call<Hoge> call, Response<Hoge> response) {
 // 通信成功時の処理。
 if (response.isSuccessful()) {
 // 通信結果をオブジェクトで受け取る。
 Hoge hoge = response.body();
 }
 }
 @Override
 public void onFailure(Call<Hoge> call, Throwable t) {
 // 通信失敗時の処理。
 }
});

[Picaso]
PicasoもRetrofitと同じSquare社製のライブラリです。
Androidの画像の読み込み、キャッシュの処理を担ってくれます。
[公式サイト]では、次のことが利点として紹介されています。
– Adapter内でのImageViewのリサイクルやダウンロード処理のキャンセルを自動で実行してくれる
– 複雑な画像の変形処理を最小のメモリ消費で実現できる
– 自動でメモリ・ファイルキャッシュをやってくれる

以上の点に加え、記述がとてもシンプルかつ安定のSquare社製ということもあり導入を決めました。

大体の場合1行で書くことができます。

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

[Butter Knife]
Butter Knife はJakeWharton先生作のライブラリです。
Viewの各要素をJava Objectにバインドする(View Injection)コードを自動生成してくれます。
– ViewのfindViewByIdの記述が楽になる
– ViewのonClickListenerなどの記述が楽になる
クラスメンバに@BindViewアノテーションを付けることで、layoutのidから任意のクラスのメンバへのマッピングが行われます。
@OnClickアノテーションも同様に、layoutのidとメソッドのマッピングを行います。

@BindView(R.id.hoge_text)
protected TextView mHogeTextView;
...
@OnClick(R.id.hoge_button)
protected void clickHogeButton(){ ... }

[EventBus]
EventBusを使うとクラス間でのイベントのやりとりがとても便利になります。
通信処理のコールバックやクリックイベントなど、様々な場面で使用しています。
以下、ざっくり使い方です。
イベントオブジェクト(例: MessageEvent)を生成してEventBusでポストします。
イベントオブジェクトは通知したいイベント別に自分で作成します。

// イベントを通知する。
EventBus.getDefault().post(new MessageEvent("こんにちは!"));

イベントを受け取りたいクラスで、イベントオブジェクトを引数にしたメソッドを定義しておくとそれが呼び出されます。

// イベントを受け取りたいクラスでイベントハンドラを宣言する。
public void onEvent(MessageEvent event) {
 Log.d("onEvent", event.message);
}

[Conceal]
ConcealはFacebookが公開している暗号化ライブラリです。
– シンプルで高速
– AES暗号化アルゴリズムを使用(共通鍵暗号方式の代表的な暗号化アルゴリズム)
 UI系のライブラリ
UI面でも様々なライブラリにお世話になっています。
[Android-ObservableScrollView]
スクロールの動作に連動して、ツールバーの表示/非表示を切り替えることができます。
[ショットワークスアプリ]のバイト一覧画面で使っています。
[Android ViewPagerIndicator]/ [Android PagerSlidingTabStrip]
両方ともViewPagerに+αしてくれるライブラリです。
ViewPagerIndicatorは[シフトワークスアプリ]のチュートリアル画面で、PagerSlidingTabStripは履歴画面で使っています。
▼ViewPagerIndicatorを用いたチュートリアル画面
shift_tutorial
▼PagerSlidingTabStripを用いた履歴画面
shift_history
 [Android View Animations]
お手軽に様々なアニメーションを実装できるライブラリです。手放せません。
[SmoothProgressBar]
読み込み中や通信中のプログレスバーを良い感じに表示してくれます。
おまけ
Fabric
[Fabric]はTwitterが公開しているモバイルアプリ開発プラットフォームです。
次の用途で使っています。
– イベントトラッキング
– クラッシュレポートの集取
– テストアプリの配信

LGTM画像のすすめ
LGTMとは Looks good to me の略です。
プルリクエストなどで行うコードレビューで、レビュアーがOKを出すときのコメントに画像を貼り付けてほっこりしようという文化です。
社外のエンジニアの方との勉強会でこのような文化があることを知り、Androidチームでは密かに導入しています。(といっても2人ですが・・)
次はどんなLGTM画像を貼ってもらえるだろうか、ちょっと楽しみですよね。
LGTM画像専門のサイトもたくさんあるようようなので、ぜひ試してみてください。

あとがき
本記事では、[インディバルのAndroidアプリ]で使っている技術について紹介してきました。
「もっとシンプルなコードにできないだろうか」「こんなUIを実現したい」と思ったとき、ライブラリの力を借りてみるのも良いのではないでしょうか。
素晴らしいOSSコミッターのみなさまに感謝しつつ、これからも改善を続けていきます。

執筆者プロフィール

新卒でインディバルに入社しました。
プログラミング全くの未経験でエンジニアの職に就き、今年で4年目になります。
Androidアプリ開発歴は1年ちょっとです。