【roppongi.aar #1】activity/fragmentからcontrollerへ処理を委譲する
TRANSCRIPT
Activity/Fragmentから Controllerへ処理を委譲する
Hiroyuki Kusu ( @hkusu_ )株式会社ゆめみ
2015/9/29 Roppongi.aar #1
自己紹介
DroidKaigiで発表の機会を頂きました。
http://www.slideshare.net/hiroyukikusu/droidkaigi2015androidmvc
作ってます。
https://play.google.com/store/apps/details?id=jp.nailbook
本題
・ Activity/Fragmentと同様に、ユーザ操作 を受けつけ Viewを操作するもの ( ViewController と呼ぶ方がしっくりくるかも)
・ Activity/Fragmentの責務を Controller に委譲することにより次のメリットがある - Activity/Fragmentをスリムに - Controllerの再利用
・ 1つの Activity/Fragmentに対して Controller は複数あっても良い (意味ある単位で作る )
本スライドにおける Controllerの定義
Activity/Fragment
ControllerControllerController
ViewViewView
new
Viewの操作Viewの操作
ユーザ操作の受けつけ
ユーザ操作の受けつけ
具体的な実装
※ 今回は Butter Knife (v7.0.1) を使います。
※ Fragment から利用する場合は onCreateView で生成したビュー を bind する⇒ ButterKnife.bind(<Controller>, <ビュー >)
@Activity
Controllerインスタンスを作成しButter Knife で Activity を bind
@Activity
ActivityのライフサイクルとControllerのライフサイクルを合わせる
@Controller
Viewと変数の関連づけ
Activityのライフサイクルと同名のメソッドを用意してライフサイクル毎の処理を記述
各 Viewのイベント
※ Controllerは普通の Javaの Class
Butter Knife のちょっとした Tips
android-apt(https://bitbucket.org/hvisser/android-apt) を導入すると Butter Knife で生成されたコー
ドが確認できたり、@onClickアノテーション等を付加したメソッドに対する IDEによる警告 (未使用 )が出なくなったりする。
(動的に決定される等の理由で )レイアウトに 存在しないかもしれないリソースは
@Nullable アノテーションを付加しておくとエラーにならない (Butter Knife のバージョン
によっては @Optional かも )。
プラグインが便利
ほか
・ Dagger等で Controllerを DIすると良いかも しれない (未検証 )
・ Controllerが増えることによりコールバック まわりが複雑になる問題 ⇒ EventBus ですこし楽になる (疎結合になりすぎないよう注意 )
これらはまたの機会に ..
サンプルコードを GitHubに置きました。
https://github.com/hkusu/android-controller-delegate-sample
おわり
予備スライド
https://github.com/greenrobot/EventBus から転載
EventBus
EventBus
イベントクラスは普通の Javaの Classなのでデータを詰め込める (参照型でも良いがリークに注意 )
@通知側
メインスレッド外のスレッドで投げたイベントを簡単にメインスレッドで受け取ることも出来る
EventBus通知側 (もしくは購読側 )の内部クラスとしてイベント
クラスを作成すればどこから通知される (もしくはどこで購読される )イベントであるかコード上わかりやすい※通知と購読の関係が多対多になったら設計を見直す。またイベントを投げ合う関係もきっと良くない
@購読側
Activity/Fragment Controller
Activity/Fragmentから Controller
直に Controllerクラスのインスタンスを参照する (interfaceを参照しても良いがやりすぎ感 )
Controllerから Activity/Fragment
・ interface で参照しコールバック (複数から利用されうる&抽象化の為 ) - Activity/Fragmentが死んでるかも&参照が残らないように注意・もしくは EventBus - Activity/Fragment Controller⇔ が互いを知ってると関係が複雑になる ので一方は通知的で良い - 必要あらば通知を受けて Activity/Fragmentから Controllerへアクセス