不定期に現れます!開発部の柿崎昭一です!

先日Android勉強会を開催したので、その際に発表したものをご報告しますね!

##そもそもなんで勉強会をやろうと思ったのか?
ベーシックでは「エンジニアフェスティバル」という「発見、疑問」をカジュアルに相談出来る場を設けています。
その「エンジニアフェスティバル」のお題で「QiitaAPIを叩いてリストに表示するアプリを作成する」というものをやりました。僕はAndroidで開発したのですが、ただ開発するだけではなく「モダンなアプリ開発」を目指しました。

その際に使用した、テクニックだったりライブラリだったりが沢山あったので、それを勉強会で共有しました。

##発表資料
発表スライド http://www.slideshare.net/ShoichiKakizaki/android-52126454

##勉強会テーマ「楽して開発すること」
Android開発を進めていると数多くの便利なライブラリを発見しました。

お陰で簡単に、楽に開発することが出来ました!先人の知恵は偉大ですね。

##APIを叩くときは「Volley」を使う
先輩、同期から教えて貰ったのですが、このライブラリが王道みたいですね。

  • Androidの通信処理フレームワーク
  • 簡単に、そして、早く実装がコンセプト
  • ネットワーク通信は非同期で処理
  • カスタムリクエストが簡単
  • Googleが開発

等の特徴があります。
実際使ってみると簡単に、データを取得出来ました。さすがGoogleさんが開発しただけあるなと…

###使い方

// APIのURLを指定
String url = "https://qiita.com/api/v2/items";

mQueue = Volley.newRequestQueue(context);
mQueue.add(new JsonArrayRequest(Request.Method.GET, url, null,
        new Response.Listener<JSONArray>() {
            @Override
			 // 結果が返ってくるとonResponseが呼ばれる
            public void onResponse(JSONArray response) {
        	 }
        },
null));

非常に簡単です。あとはonResponseメソッドで結果を処理すればOKです。

##非同期の通知をする際は「EventBus」を使う
以前、Droidkaigiに参加した際に、皆口を揃えて「EventBusいいよ!」と仰っていたので、今回使ってみました。

  • アプリケーション内の任意のインスタンスに任意の通知を送れる
  • データも詰め込めて、スレッドも飛び越える
  • 通知を受け取る側が死んでいてもアプリは落ちない
  • コールバックが基本一対一に対し、一体多の通知も可能

等の特徴があります。

実際使ってみるとめっちゃ使いやすかったです。何が良いって「通知を受け取る側が死んでもアプリが落ちない」
というところです。Activityは突然死ぬので非同期の通知系で落ちないのは本当に助かります…

###使い方

先ほどのコードにEventBusを追加して

// APIのURLを指定
String url = "https://qiita.com/api/v2/items";

mQueue = Volley.newRequestQueue(context);
mQueue.add(new JsonArrayRequest(Request.Method.GET, url, null,
        new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
				// 非同期でeventBusにpostする
               eventBus.post(new AsyncQiita(true, mResponse));
        	 }
        },
null));

Volleyで取得したデータを整形

public class AsyncQiita {

    private boolean mSuccess;
    private ArrayList<String> mTitle = new ArrayList<String>();
    private ArrayList<String> mUri = new ArrayList<String>();

    // JSONArray用のコンストラクタ
    public AsyncQiita(boolean success, JSONArray response) {
        mSuccess = success;
        createStatus(response);
    }

    public boolean isSuccess(){
        return mSuccess;
    }

    public ArrayList title(){
        return mTitle;
    }

    public ArrayList uri(){
        return mUri;
    }

    // 必要なデータを生成する
    private void createStatus(JSONArray response){
        for (int i = 0; i < response.length(); i++) {
            try {
                JSONObject qiita = (JSONObject) response.get(i);
                mTitle.add(qiita.getString("title"));
                mUri.add(qiita.getString("url"));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}

Activity or Framgnetで通知を受け取る

// EventBusの通知を取得
public void onEvent(AsyncQiita event) {
    mTitles = event.title();
    mUris = event.uri();
}

他にも細かい設定が必要ですが、基本的にはこれだけです。めっちゃ簡単です。

##Viewを作成する際は「ButterKnife」を使う
コレもDroidkaigiでオススメしていたのですが、どうやらを簡単にView作成出来るライブラリらしいです。
Androidでボタン、テキストを配置する際には、以下のように

Button button = (Button)findViewById(R.id.button);

のように書かなくてはなりませんでした…(findViewByIdって長い…)
これをButterKnifeを使うことで

@InjectView(R.id.button)
Button button;

と置き換えることが出来ます!

でもこれだと「結局書かないといけないじゃん!」と思わずツッコミを入れたくなると思います。

ですが、「ButterKnifeZelezny」というプラグインを導入することでなんと自動生成出来ます!
導入方法は下記を参考にしました!

http://dev.classmethod.jp/smartphone/android-butterknifezelezny/

こちらを使うと本当に楽になります!

ButterKnife…本当に衝撃でした…!Androidボタン定義は結構面倒臭かったのですが、ButtterKnifeのお陰でめっちゃ楽になりそうです!感謝…!

##SQLiteの操作には「ActiveAndroid」を使う
僕はずっとRailsを書いてきたのでDBの操作はActiveRecordっぽく書きたいなーと思い探したところありました「ActiveAndroid」

  • SQLiteのO/Rマッパー
  • ActiveRecordモデルがベース
  • DBへのアクセスが楽になる
  • 設定も非常に簡単

等の特徴があります。

###使い方

まずはテーブルを定義して

@Table(name = "SampleModel")
public class SampleModel extends Model {
    @Column(name = "title", notNull = true)
    public String title;

    @Column(name = "uri", notNull = true)
    public String uri;

    public ReadLaterModel() {
        super();
    }
}

insertします

// 値を追加する
public static boolean insertValue(String title, String uri){
    SampleModel dbManager  = new SampleModel();
    try {
        dbManager.title = title;
        dbManager.uri = uri;
        dbManager.save();
        return true;
    } catch(Exception e) {
        return false;
    }
}

Rails経験者には見覚えのある構文ですね!

設定部分は省略していますが、めっちゃん簡単でした!
これで「ActiveRecord」と同じような感じでDBを操作することが出来るので、僕のなかで敷居がガクッと下がりました!!おすすめです!

###実際に発表をしてみて
かなりボリュームがあったので全てを伝えるのは難しかったです…
1時間の枠で説明するにはかなり駆け足になってしまい、上手く説明出来ませんでした…。(反省です)

ですが、僕の今回の発表を聞いて「Androidアプリ開発に興味が湧いた!」
というメンバーもいたのでよかったです!

次勉強会をやるときは個々の技術にもっとフォーカスを当ててやりたいなと考えております!