SlideShare ist ein Scribd-Unternehmen logo
1 von 65
Tokushima.app #6
Android アプリハンズオン
〜通貨計算アプリをつくる〜
2015/12/13(日)
@Aizyu Tokushima Basement
辰濱健一
はじめに
• Tokushima.app 初の試みで、ハンズオンやります。
• 作るモノは、簡単な通貨計算アプリ
• ソースコードは下記で公開済み
• https://github.com/tatsuhama/CurrencyConverterAndroid
• 色んなライブラリを使う練習です
• デザイン的な事は気にしていません。
• ※後半は中・上級者向け内容になってしまいました。。。
進め方
• Android Studio でイチから作るも可
• Github 上の各コミットを見て打ったりコピペしたりする
• Github から clone して進める
• SourceTree を使うと、わかりやすいです
完成イメージ
使うライブラリ
• ButterKnife : http://jakewharton.github.io/butterknife/
• Retrofit : http://square.github.io/retrofit/
• OkHttp : http://square.github.io/okhttp/
• RxAndroid : https://github.com/ReactiveX/RxAndroid
• Realm : https://realm.io/jp/
• Stetho : http://facebook.github.io/stetho/
• Stetho-OkHttp : https://github.com/facebook/stetho/tree/master/stetho-
okhttp
• Stetho-Realm : https://github.com/uPhyca/stetho-realm
• Retrolambda : https://github.com/orfjackal/retrolambda
自分で打つ人向け準備
Android Studio で NewProject
• 値はなんでもいいです。
Target Android Devices
• 今回はデフォルト(Phone and Tablet)のままで
• 最低限、使う機種では動くように…
Add an activity to Mobile
• Empty Activity で
Customize the Activity
• デフォルトのままで、Finish
Git から clone する人向け準備
• clone する(どちらかの方法)
• ターミナルで
• git clone git@github.com:tatsuhama/CurrencyConverterAndroid.git
• SourceTree で
• ???
• Android Studio で開く
• File – open
• CurrencyConverterAndroid/build.gradle を開く
AndroidStudio の画面
緑三角で実行
画面レイアウトを作る
• 完成形
TextView
TextView
EditText
画面レイアウトを作る
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/d
87c5348254573b13dd749f73bf36210f77a1667
参照
実行結果
View との関連づけ
• xml で定義した View とコードを関連づける
• 変数へのマッピング
• onClick イベントのハンドリング
• 確認のためにトーストを出してみる
• ButterKnife を使って記述する
View との関連づけ
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/b
0bbb64225add5ef63971fbf815f3e90e28b2a16
参照
• 【参考】ButterKnife を使わなかった場合の記述
https://github.com/tatsuhama/CurrencyConverterAndroid/commit/e7
46eaa81f2e69b3430944a88562d4bfbd16af28
実行結果
• ボタンクリックで、仕込んだ
トーストが表示されれば OK
通貨ボタンをタップで別画面を呼び出す
• ひとまず、Activity のスケルトンを呼び出す
• CodeChooserActivity という名前で。
• 何らかのレイアウトファイルも作っておく
• Intent を作って CodeChooserActivityを start させる
• AndroidManifest.xml への追加
通貨ボタンをタップで別画面を呼び出す
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/7
dccc7939c80be0f302b1fc95194613c38c727c8
参照
実行結果
通貨選択画面の実装
• 通貨単位を enum で定義する
• Enum 一覧を ListView に表示させる
通貨選択画面の実装
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/d
336570b2e4750c16951eac8a47e3a2da72cfcce
参照
実行結果
• まだタップしたときの処理を
記述していない…
通貨選択処理
• ListView に OnItemClickListener を設定する
• onItemClick で
• 呼び出し元画面に選択結果を送る
• Intent の Bundle にデータを積んで setResult する
• 通貨選択画面を閉じる
• finish() 呼び出し
通貨選択処理
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/5
ceed0f957facc1b22a5bd9a39a89415f54be57f
参照
実行結果
元画面での結果受け取り
• 通貨選択画面で選択した結果をボタンに反映する
• onActivityResult で結果を受け取る
• requestCode で呼び出し元画面を識別する
• requestCode で区別して、適切なボタンに値を setText する
現在の為替を取得
• http://api.aoikujira.com/kawase/
を使う
• 通信ライブラリは Retrofit
• クラスを定義するのが良いが、HashMap で受け取る。
• 通貨の選択肢が多く、クラス作ると Getter と enum とのマッピングが辛いため
• リフレクションを使えば、(ry
• 計算ボタンをタップすると通信実行
現在の為替を取得
↓JSON 形式で、USD 基準で取得した結果
現在の為替を取得
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/b
f3284eea3d4eeecb73382b314a42123d0a3366a
参照
• android.permission.INTERNET を忘れずに
API から取得した値を使って、計算結果
を表示
• HashMap<String, String> から欲しい値を取得
• “API_URL”: http://api.aoikujira.com/kawase/
• “basecode”: “USD”
• “result”: “ok”
• “update”: “2015-12-13 04:14:59”
• “JPY”: “120.92791”
• “ARS”: “9.76907”
• “AUD”: “1.39131”
• String → Double の変換をして計算する
API から取得した値を使って、計算結果
を表示
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/5
12cc0da8b4fc488f114cefc9d7e6bf0f1a2102d
参照
初級編終了!
中級編へ…
Stetho を使って通信状況をみる
• Chrome で通信状況が確認できる
• Stetho をアプリに組み込んでおく
• chrome://inspect/#devices を開いて、inspect を開く
Stetho を使って通信状況をみる
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/f0
c9429d1ce139c31084b43a00b8cc2b29199ec9
参照
実行結果
• chrome://inspect/#devices を開いて、inspect を開く
• アプリで通信操作を実行する
実行結果
取得したい値を指定して、通信量削減
• 今は使わない色んな結果も返ってきている。
• リクエストパラメータにどの国に変換するかを設定することで、
結果を絞ることができる
• Retrofit の Api Interface を修正する
API 仕様
これを指定する
取得したい値を指定して、通信量削減
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/f
be3dc1f712011e2e64073e7b42d50743880361c
参照
実行結果
• Stetho で確認してみよう!
Before
After
通信結果を Realm にキャッシュ
• 今は、計算する度に通信を実行している
• 100円 → ???$、1,000円 → ???$
• そんなに為替計数が頻繁に変わるわけじゃないので、不要な通
信をさせないために、前回の通信結果を DB に保存
• 比較的最近(サンプルでは10分)前の結果があれば利用して不
要な通信をしないようにした
通信結果を Realm にキャッシュ
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/ef
a9ee895108cf97a00d918fe8b41267df9f2ca8
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/ff
43caac690c98490aba2326f38aecd1dd008a2a
参照
• 注意:Relam の最新版は 0.86 ですが、後に使う Stetho-Realm と
の相性問題のために 0.85.1 を使用する
実行結果
• デバッグや Stetho を使って不要な通信が行われないことを確認
• DB にキャッシュがあれば、オフラインでも実行可能
Stetho-Realm で Realm のテーブルを見る
• Stetho で通信を見たのと同様に、Realm のテーブルを見る
• Stetho-Realm をアプリに組み込む
Stetho-Realm で Realm のテーブルを見る
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/ef
a9ee895108cf97a00d918fe8b41267df9f2ca8
参照
実行結果
余談
• Realm 0.86 & Stetho-Realm だと、Stetho でテーブルを開こうとす
るとクラッシュ
• 原因は、Realm 0.86 で大きな内部変更が入り、Stetho-Realm が
それに追従できていないんだとか。。。
爆速回答
爆速解決
中級編終了
上級編
【課題】メインスレッドで
データの加工や DB 操作をしている…
このぐらいなら、パフォーマンスに与える影響は軽微だけど…
RxAndroid を使ってバックグラウンドで処
理&メインスレッドへコールバック
• Retrofit の API で Observable<?> を返す
• subscribeOn(Schedulers.newThread())
• バックグラウンドスレッドで実行
• map
• 変換処理
• observeOn(AndroidSchedulers.mainThread())
• メインスレッドで実行
RxAndroid を使ってバックグラウンドで処
理&メインスレッドへコールバック
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/4
4edddbb708a666b00e4df4d5c47ac9518a23722
参照
実行結果
• デバッグ実行で、意図したスレッドで実行できているか確認
実行結果
• デバッグ実行で、意図したスレッドで実行できているか確認
Retrolambda を使ってラムダ式を使う
• コールバックがシンプルに書ける
• Java8 が必要
Retrolambda を使ってラムダ式を使う
• https://github.com/tatsuhama/CurrencyConverterAndroid/commit/2
7fbf0b02eee5547c2dfb6b1f288f827c53c8df2
参照
Retrolambda を使ってラムダ式を使う
• 「ラムダ式で書けるよ!」って所は、Android Studio が教えてく
れる
Retrolambda を使ってラムダ式を使う
• それだけじゃなく、変換もやってくれる
Retrolambda を使ってラムダ式を使う
• 変換後
上級編終了
• お疲れさまでした!
次回ハンズオン
• これを Kotlin or Swift でやる(かも?)

Weitere ähnliche Inhalte

Ähnlich wie 20151213 tokushimaapp

続・Twitter bootstrap入門 #html5j
続・Twitter bootstrap入門 #html5j続・Twitter bootstrap入門 #html5j
続・Twitter bootstrap入門 #html5j
Toshiaki Maki
 
a-blogcsm な寺子屋 2 in Okazaki
a-blogcsm な寺子屋 2 in Okazakia-blogcsm な寺子屋 2 in Okazaki
a-blogcsm な寺子屋 2 in Okazaki
Etsushi Ishii
 
Introduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersIntroduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature Engineers
Takeshi Arabiki
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
Yohei Fushii
 
Rubyで作るクローラー Ruby crawler
Rubyで作るクローラー Ruby crawlerRubyで作るクローラー Ruby crawler
Rubyで作るクローラー Ruby crawler
Takuro Sasaki
 

Ähnlich wie 20151213 tokushimaapp (20)

Ember コミュニティとわたし
Ember コミュニティとわたしEmber コミュニティとわたし
Ember コミュニティとわたし
 
続・Twitter bootstrap入門 #html5j
続・Twitter bootstrap入門 #html5j続・Twitter bootstrap入門 #html5j
続・Twitter bootstrap入門 #html5j
 
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
 
a-blogcsm な寺子屋 2 in Okazaki
a-blogcsm な寺子屋 2 in Okazakia-blogcsm な寺子屋 2 in Okazaki
a-blogcsm な寺子屋 2 in Okazaki
 
oFの話題が殆ど出ない oF jp Summer Workout
oFの話題が殆ど出ない oF jp Summer WorkoutoFの話題が殆ど出ない oF jp Summer Workout
oFの話題が殆ど出ない oF jp Summer Workout
 
今時のオンプレなgithubクローン環境構築
今時のオンプレなgithubクローン環境構築今時のオンプレなgithubクローン環境構築
今時のオンプレなgithubクローン環境構築
 
Git & GitHub & kintone でウルトラハッピー!
Git & GitHub & kintone でウルトラハッピー!Git & GitHub & kintone でウルトラハッピー!
Git & GitHub & kintone でウルトラハッピー!
 
Dive into the Cloud with our buddy, lovely PHP!
Dive into the Cloud with our buddy, lovely PHP!Dive into the Cloud with our buddy, lovely PHP!
Dive into the Cloud with our buddy, lovely PHP!
 
Introduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature EngineersIntroduction to Favmemo for Immature Engineers
Introduction to Favmemo for Immature Engineers
 
Avalonia for MacApps
Avalonia for MacAppsAvalonia for MacApps
Avalonia for MacApps
 
Google Apps Scirpt勉強会 #1
Google Apps Scirpt勉強会 #1Google Apps Scirpt勉強会 #1
Google Apps Scirpt勉強会 #1
 
Robotium を使った UI テスト
Robotium を使った UI テストRobotium を使った UI テスト
Robotium を使った UI テスト
 
Hatena blogdevelopmentflow
Hatena blogdevelopmentflowHatena blogdevelopmentflow
Hatena blogdevelopmentflow
 
Yapc2012資料
Yapc2012資料Yapc2012資料
Yapc2012資料
 
SnapDishの事例
SnapDishの事例SnapDishの事例
SnapDishの事例
 
"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?
"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?
"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 
Rubyで作るクローラー Ruby crawler
Rubyで作るクローラー Ruby crawlerRubyで作るクローラー Ruby crawler
Rubyで作るクローラー Ruby crawler
 
4th tokushimaapp
4th tokushimaapp4th tokushimaapp
4th tokushimaapp
 
Chainerで学ぶdeep learning
Chainerで学ぶdeep learningChainerで学ぶdeep learning
Chainerで学ぶdeep learning
 

Mehr von 健一 辰濱

Mehr von 健一 辰濱 (20)

地方創生ワカモノ会合
地方創生ワカモノ会合地方創生ワカモノ会合
地方創生ワカモノ会合
 
Google Analytics のデータ分析ハンズオン
Google Analytics のデータ分析ハンズオンGoogle Analytics のデータ分析ハンズオン
Google Analytics のデータ分析ハンズオン
 
Sansan Tech Meetup Androidエンジニアが振り返る Google I/O
 Sansan Tech Meetup Androidエンジニアが振り返る Google I/O   Sansan Tech Meetup Androidエンジニアが振り返る Google I/O
Sansan Tech Meetup Androidエンジニアが振り返る Google I/O
 
知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について
 
Android 開発の昔と今
Android 開発の昔と今Android 開発の昔と今
Android 開発の昔と今
 
Firebase Extensions はじめの一歩
Firebase Extensions はじめの一歩Firebase Extensions はじめの一歩
Firebase Extensions はじめの一歩
 
Firebase & BigQuery で Android アプリの成⻑を支える
Firebase & BigQuery で Android アプリの成⻑を支えるFirebase & BigQuery で Android アプリの成⻑を支える
Firebase & BigQuery で Android アプリの成⻑を支える
 
GDG DevFest Tokyo 2019 Day2 Special Hands-on
GDG DevFest Tokyo 2019 Day2 Special Hands-onGDG DevFest Tokyo 2019 Day2 Special Hands-on
GDG DevFest Tokyo 2019 Day2 Special Hands-on
 
Firebase Summit 2019 Recap
Firebase Summit 2019 RecapFirebase Summit 2019 Recap
Firebase Summit 2019 Recap
 
Cloud Firestore を使って、Polling をやめたい話
Cloud Firestore を使って、Polling をやめたい話Cloud Firestore を使って、Polling をやめたい話
Cloud Firestore を使って、Polling をやめたい話
 
Firebase hands on in Matsuyama
Firebase hands on in MatsuyamaFirebase hands on in Matsuyama
Firebase hands on in Matsuyama
 
インドのインターネット環境 との戦い方
インドのインターネット環境との戦い方インドのインターネット環境との戦い方
インドのインターネット環境 との戦い方
 
インドの低速なネットワーク環境の攻略法
インドの低速なネットワーク環境の攻略法インドの低速なネットワーク環境の攻略法
インドの低速なネットワーク環境の攻略法
 
DroidKaigi 2018 参加報告会 Closing
DroidKaigi 2018 参加報告会 ClosingDroidKaigi 2018 参加報告会 Closing
DroidKaigi 2018 参加報告会 Closing
 
企業スポンサー
企業スポンサー企業スポンサー
企業スポンサー
 
参加したセッションの ピックアップ
参加したセッションのピックアップ参加したセッションのピックアップ
参加したセッションの ピックアップ
 
CFP(Call For Paper) を出す話
CFP(Call For Paper)を出す話CFP(Call For Paper)を出す話
CFP(Call For Paper) を出す話
 
DroidKaigi 2018 参加報告会
DroidKaigi 2018 参加報告会DroidKaigi 2018 参加報告会
DroidKaigi 2018 参加報告会
 
DroidKaigi アプリの内部を見る
DroidKaigi アプリの内部を見るDroidKaigi アプリの内部を見る
DroidKaigi アプリの内部を見る
 
Java で書かれた Android アプリに Kotlin を適用させていく
Java で書かれた Android アプリに Kotlin を適用させていくJava で書かれた Android アプリに Kotlin を適用させていく
Java で書かれた Android アプリに Kotlin を適用させていく
 

20151213 tokushimaapp