Android版 電車なうの中身
はじめに
最近Androidマーケットにリリースされたちょー便利あぷり電車なうAndroid版の中身を解説します。
このアプリは電車の情報(遅延など)を表示するアプリです。 情報の取得をTwitterにすることで、リアルタイム性、耐障害性(APIにたまに繋がりませんが..)が高まっています。 アプリの紹介はおおはしりきたけの『電車なう公開しました』を見てください。
画面の遷移
鉄道会社選択 ↓ 路線選択 ↓ タイムライン表示
又は
ブックマーク選択 ↓ タイムライン表示
となっています。
ざっくりしたアーキテクチャ
さて裏側ですが、図のように非常にシンプルな作りとなっています。
以下ポイントです。
Twitter API呼び出しにTwitter4J for Androidを使用
Android版のTwitter4Jはjson.orgのライブラリを含まない(Android標準のlibを使っている?)為、ファイルサイズが小さくなっているようです。今回はログインが必要なく検索だけですので、API呼び出しは下の例のように非常にシンプルなコードになりました。
public List<Tweet> search(String searchWord, long sinceId, int rpp) throws TwitterException { Query query = new Query(searchWord); query.setResultType(Query.RECENT); // 最新から取得 query.setPage(1); // ページ query.setRpp(rpp); // 取得するTweetの数。 query.setSinceId(sinceId); // どのTweetID以降を取得するか。 QueryResult result = twitter.search(query); // 検索実行 return result.getTweets(); // 結果からTweetオブジェクトをリストでを取得。 }
定期的にTweetの取得を実行
Java のTimerを使用するとメインスレッドとは別スレッドで処理し、Android のHandlerを使用するとメインスレッドで処理します。描画等の処理が絡む場合はメインスレッドで処理しないと例外が発生する為、Handlerを使用します。今回はdoGetTweeetSearchメソッド内で別スレッドで処理している為、Handlerを使用しました。ま、今回の場合はどちらでもいいのですが。
private Handler mHandler = new Handler(); とあるメソッド(){ mRunnable = new Runnable() { @Override public void run() { doGetTweeetSearch(searchWord); mHandler.postDelayed(this, 1000 * REFRESH_INTERVAL_SEC); } }; mHandler.postDelayed(mRunnable, 0); }
構造化した文字列の定義(string-array)
文字データを構造化して持ちたい場合にいつもどう持つか悩みます。国際化のためにも、お約束に沿うためにも極力strings.xmで定義したいと考えています。 ここでは古典的な方法ですが、"|"をデリミタとして保存し、Java側ではString.split();で取得します。
<string-array name="line_name_search"> <item>1-1|JR|山手線</item> <item>1-2|JR|京浜東北線</item> <item>1-3|JR|総武線</item> <!-- 以下省略 --> </string-array>
といった感じになっています。 どんどん使ってもらって、バージョンアップしていきたいので、評価、要望をお待ちしております。