【roppongi.aar #1】activity/fragmentからcontrollerへ処理を委譲する

26
Activity/ Fragment かか Controller か かかかかかかか Hiroyuki Kusu ( @hkusu_ ) かかかかかかか 2015/9/29 Roppongi.aar #1

Upload: hiroyuki-kusu

Post on 13-Apr-2017

1.816 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

Activity/Fragmentから Controllerへ処理を委譲する

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

2015/9/29 Roppongi.aar #1

Page 2: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

自己紹介

Page 3: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する
Page 4: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

DroidKaigiで発表の機会を頂きました。

http://www.slideshare.net/hiroyukikusu/droidkaigi2015androidmvc

Page 5: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

作ってます。

https://play.google.com/store/apps/details?id=jp.nailbook

Page 6: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

本題

Page 7: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

・ Activity/Fragmentと同様に、ユーザ操作 を受けつけ Viewを操作するもの ( ViewController と呼ぶ方がしっくりくるかも)

・ Activity/Fragmentの責務を Controller に委譲することにより次のメリットがある - Activity/Fragmentをスリムに - Controllerの再利用

・ 1つの Activity/Fragmentに対して Controller は複数あっても良い (意味ある単位で作る )

本スライドにおける Controllerの定義

Page 8: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

Activity/Fragment

ControllerControllerController

ViewViewView

new

Viewの操作Viewの操作

ユーザ操作の受けつけ

ユーザ操作の受けつけ

Page 9: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

具体的な実装

※ 今回は Butter Knife (v7.0.1) を使います。

Page 10: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

※ Fragment から利用する場合は onCreateView で生成したビュー を bind する⇒ ButterKnife.bind(<Controller>, <ビュー >)

@Activity

Controllerインスタンスを作成しButter Knife で Activity を bind

Page 11: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

@Activity

ActivityのライフサイクルとControllerのライフサイクルを合わせる

Page 12: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

@Controller

Viewと変数の関連づけ

Activityのライフサイクルと同名のメソッドを用意してライフサイクル毎の処理を記述

各 Viewのイベント

※ Controllerは普通の Javaの Class

Page 13: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

Butter Knife のちょっとした Tips

Page 14: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

android-apt(https://bitbucket.org/hvisser/android-apt) を導入すると Butter Knife で生成されたコー

ドが確認できたり、@onClickアノテーション等を付加したメソッドに対する IDEによる警告 (未使用 )が出なくなったりする。

Page 15: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

(動的に決定される等の理由で )レイアウトに 存在しないかもしれないリソースは

@Nullable アノテーションを付加しておくとエラーにならない (Butter Knife のバージョン

によっては @Optional かも )。

Page 16: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

プラグインが便利

Page 17: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する
Page 18: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

ほか

Page 19: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

・ Dagger等で Controllerを DIすると良いかも しれない (未検証 )

・ Controllerが増えることによりコールバック まわりが複雑になる問題 ⇒ EventBus ですこし楽になる (疎結合になりすぎないよう注意 )

これらはまたの機会に ..

Page 20: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

サンプルコードを GitHubに置きました。

https://github.com/hkusu/android-controller-delegate-sample

Page 21: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

おわり

Page 22: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

予備スライド

Page 23: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

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

EventBus

Page 24: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

EventBus

イベントクラスは普通の Javaの Classなのでデータを詰め込める (参照型でも良いがリークに注意 )

@通知側

Page 25: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

メインスレッド外のスレッドで投げたイベントを簡単にメインスレッドで受け取ることも出来る

EventBus通知側 (もしくは購読側 )の内部クラスとしてイベント

クラスを作成すればどこから通知される (もしくはどこで購読される )イベントであるかコード上わかりやすい※通知と購読の関係が多対多になったら設計を見直す。またイベントを投げ合う関係もきっと良くない

@購読側

Page 26: 【Roppongi.aar #1】Activity/FragmentからControllerへ処理を委譲する

Activity/Fragment Controller

Activity/Fragmentから Controller

直に Controllerクラスのインスタンスを参照する (interfaceを参照しても良いがやりすぎ感 )

Controllerから Activity/Fragment

・ interface で参照しコールバック (複数から利用されうる&抽象化の為 ) - Activity/Fragmentが死んでるかも&参照が残らないように注意・もしくは EventBus - Activity/Fragment Controller⇔ が互いを知ってると関係が複雑になる ので一方は通知的で良い - 必要あらば通知を受けて Activity/Fragmentから Controllerへアクセス