【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

63
初学者に嬉しい Android開発環境 (あとMVCとか) Hiroyuki Kusu ( @hkusu_ ) 株式会社ゆめみ 2015/4/25 DroidKaigi

Transcript of 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Page 1: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

初学者に嬉しいAndroid開発環境

(あとMVCとか)

Hiroyuki Kusu ( @hkusu_ )株式会社ゆめみ

2015/4/25 DroidKaigi

Page 2: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

自己紹介

・元々はサーバサイドエンジニア

・SE職/マネジメント職が長かった(最近、技術職にもどった)

・Android はそれほど長くない

・ほかには JavaScript などをやっていきたい(希望)

Page 3: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

アウトライン

①環境・ライブラリ

②アプリケーション構成(MVC)

③学習リソース

※前提として、ゲームやハードウェア/OS機能を使うものではなく、WEBサービス的な Android アプリの開発

Page 4: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

アウトライン

①環境・ライブラリ

②アプリケーション構成(MVC)

③学習リソース

Page 5: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

環境

Page 6: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・いまからやるなら Android Studio 一択

・JetBrains 社製。WebStorm、RubyMine らと同じ感触でさわれる

・iOS 用は AppCode というのがある

・補完とかリファクタ機能とかもすごい

・Gradle 便利(らしい)

IDE

Page 7: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

何も設定しなくてもAndroid Studio がいろいろ教えてくれる

Page 8: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

困ったら [shift] キー2回押し

Page 9: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・Genymotion を使う・VirtualBox 上で動くので速い

・Android Studio 用のプラグインあわせて

シミュレータ

Page 10: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

ライブラリ

Page 11: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・レイアウトXML上のViewとの関連づけ

・Viewのインベント取得

Butter Knife

Page 12: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Android Studio 用のプラグイン

Page 13: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・手間が減るというより、Fragmentクラスの冒頭に利用するViewが定義されるというコードスタイルが視覚的に分かりやすい

・リスナーをセットする煩雑なコードが減る

・他には AndroidAnnotations がある・もっと色々できる(ただ、できすぎて初学者は混乱するかも)

Page 14: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

https://github.com/greenrobot/EventBus から転載

EventBus

Page 15: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・アプリケーション内の任意のインスタンスに任意の通知を送れる

・データも詰め込め、スレッドも飛び越える

・通知を受け取る側が死んでいてもアプリは落ちない

Page 16: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・イベントを送る側

・インベントを受け取る側

Page 17: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・WEB-API を叩いて結果を受け取る場合

・画像の読み込みは Picasso を利用する

Retorofit OkHttp Gson

Page 18: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
Page 19: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
Page 20: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・データを保存する必要がある場合

・SQL は直に書かずに Active Android を使う

・ほかには Realm・SQLiteではなく独自データストア

ORM

Page 21: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

アウトライン

①環境・ライブラリ

②アプリケーション構成(MVC)

③学習リソース

Page 22: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

MVC構成が分かりやすく、破綻しないと思う

Page 23: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Model

View Controller① GUIイベント

③描画依頼

④データ取り出し②モデル操作・更新

データの保持&ビジネスロジック

(WEB-APIを発行するのはModel)

Page 24: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Model

View Controller① GUIイベント

③描画依頼

Fragment(or Activity)

レイアウトXMLView、ViewGroupクラス

③④はControllerを経由する

Androidの場合

②モデル操作・更新

データの保持&ビジネスロジック

(WEB-APIを発行するのはModel)

④データ取り出し

普通のJavaクラス

Page 25: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Model

View Controller① GUIイベント

②モデル操作・更新

③描画依頼

Fragment(or Activity)

普通のJavaクラス

③④はControllerを経由する

Androidの場合

Event Bus

ORM

Retrofit 等

Butter Knife

データの保持&ビジネスロジック

(WEB-APIを発行するのはModel)

レイアウトXMLView、ViewGroupクラス

④データ取り出し

Page 26: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Model (普通のJavaクラス)

・データの保持(変数)とデータの操作メソッド

・Controller からこちらに追い出す

・イベント取得やViewパーツの操作はしない

Page 27: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Fragment

Fragment

Fragment

Model

長寿

短命

インスタンスの参照

WEB-APIの発行など

複数の画面で使いまわす場合や、時間がかかる処理をある場合

Page 28: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・長寿の Model はシングルトンに

・インスタンスの参照の取得

Page 29: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・データ構造を表現するクラス(Entity)を用意しておく

・Modelで扱うListデータの要素とする

・ORM(Active Android、Realm)や Gson を利用する場合は、それらが提供するものを使う

Page 30: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Model

View Controller① GUIイベント

②モデル操作・更新

③描画依頼

④データ取り出し

データの保持&ビジネスロジック

(WEB-APIを発行するのはModel)

Page 31: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Fragment(or Activity) のコード

・Model側では、データが変更されたら EventBus のイベントを投げるようにしておく

・Fragment(or Activity)では、Model のデータで viewの表示を洗い替えるようなメソッドを用意

⇒Model が更新されたら自動的にview が更新される

Page 32: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

コールバックしたり Observable を使ってもよいが..

・コールバックはコールバック先が落ちている可能性がある

・Fragment(or Activity)なら尚更

・Observable より EventBus 使った方が楽

Page 33: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

View レイアウトXML、View、ViewGroup

・クラスを作るときはイベントは処理させない

・それは Controller の仕事

・レイアウトXMLにもイベントに関するものは定義しない(onClick など)

・(できるだけ)コードでViewの生成や設定は行わない

Page 34: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Controller Fragment (Activity)

Activity

Activity

Activity

Activity

画面遷移的なものは Activity をインテントで切り替えるのではなくて、

Page 35: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Activity

Fragment

Fragment

Fragment

Fragmentを切り替える(その方が楽)※ただしアプリケーションによる

コンテナ

Page 36: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・アプリケーションに Activity はひとつ

・画面1つに対して Fragment はひとつ(ただしパーツの再利用やタブレット向けの場合は

その限りではない)

・Fragment on Fragment はできればやらない

Page 37: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Fragment が肥大化する問題

・目安として500行〜1000行を超えてきたら?

・Fragment をサブ Controller やサブ Modelへ分割する

・Adapter 類はインナークラスから追い出す

Page 38: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Fragment サブ Controller クラス

new して利用

・Java 的に通常のクラス(not Fragment)

・Fragmentと同名のライフサイクルメソッドを実装して操作する

・イベント取得やViewパーツの操作含めて良い

・呼び出し元の Fragment と同じ寿命

サブ Controller への分割

Page 39: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
Page 40: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Fragment サブ Model クラス

new して利用

・データとビジネスロジック

・イベント取得やViewパーツの操作含めてはダメ

・これも呼び出し元の Fragment と同じ寿命

サブ Model への分割

Page 41: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

https://github.com/hkusu/android-mvc-sample

だいたいここまでの構成でサンプルを作った。

Page 42: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
Page 43: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

アウトライン

①環境・ライブラリ

②アプリケーション構成(MVC)

③学習リソース

Page 44: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

書籍

Page 45: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・AndroidエンジニアのためのモダンJavahttp://www.amazon.co.jp/dp/477415878X

・Java未経験者向け。とりあえずこれ一冊でも十分

・Java言語で学ぶデザインパターン入門http://www.amazon.co.jp/dp/4797327030

・EFFECTIVE JAVAhttp://www.amazon.co.jp/dp/4621066056

書籍(Java)

Page 46: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

書籍(Android)

・AndroidStudioではじめるAndroidプログラミング入門http://www.amazon.co.jp/dp/4798041025

・Androidプログラミングバイブルhttp://www.amazon.co.jp/dp/4883378063

・Android SDK逆引きハンドブックhttp://www.amazon.co.jp/dp/486354104X

Page 47: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

書籍(Android:UI)

・Android Pattern Cookbookhttp://www.amazon.co.jp/dp/4844335650

・Android UI Cookbook for 4.0 ICShttp://www.amazon.co.jp/dp/4844331744

・Android Layout Cookbookhttp://www.amazon.co.jp/dp/4844329871

Page 48: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

参考になるソース

Page 49: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Android Studio のプロジェクト作成時の雛形

Page 50: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Android Studio で自動生成できる Fragment の雛形

Page 51: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

GitHub(https://github.com/googlesamples)で公開されているものと同じ

Googleのサンプル

Page 52: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・まずはドットインストール・mixiさんのトレーニング資料は慣れてきてから見る

(初学者には少し敷居がある)

・ハードウェアやOSまわりの機能は後回し(必要になったら調べる、ぐらいの感覚で)

・通信、SQLiteまわりはライブラリを使う前提で(生で書く機会はそんなにない、と思う)

・端末の向きを固定(回転させない)(Activity や Fragment のライフサイクルや状態の保存がややこしくなる)

・タブレットの2ペインレイアウトやらない(1画面1Fragmentが最初はやりやすい)

初学者向けの学習方法

Page 53: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

おわり

Page 54: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

以降、予備スライド

Page 55: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Applicationクラス

・初期化処理やインスタンスの参照の保持に

・ここで参照してるとGCされないので注意

Page 56: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
Page 57: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・レイアウトに関する固定値は、教科書どおり res フォルダ配下の XML で管理する

・ロジックに関するものは普通に固定値クラスを作って public static final で定義する

・その Fragment でのみ利用するものはその Fragmentに書いてもよいと思う

固定値

Page 58: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

動的に生成するものは static メソッドを用意する

Page 59: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

・便利関数的なものは、それ用のクラスを作り、static なメソッドを定義する

・手続き型言語の関数的なものなので、このクラスでは状態は保持しない

Utility系の便利関数

Page 60: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
Page 61: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

Activity、Fragment 内では、他の Activity、Fragment のインスタンスの参照を取得できるようになっていてる

Page 62: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

参照さえ取得してしまえば、そのインスタンス(Activity、Fragment)のメソッドを実行できる

Page 63: 【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)

独自のリスナークラスを作成して利用すると、匿名クラスの定義でコードが煩雑になるのを防ぎ、また再利用や値の保持(コンストラクタで渡す)ができる