不定期に現れます!開発部の柿崎昭一です!
先日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アプリ開発に興味が湧いた!」
というメンバーもいたのでよかったです!
次勉強会をやるときは個々の技術にもっとフォーカスを当ててやりたいなと考えております!