Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Inside Architecture Components
Search
kobito-kaba
February 07, 2018
Programming
4
4.3k
Inside Architecture Components
Lifecycle, LiveData, ViewModelの使いかたとその仕組みについて
kobito-kaba
February 07, 2018
Tweet
Share
More Decks by kobito-kaba
See All by kobito-kaba
新規プロジェクトでやってよかったことまとめ
kobitokaba
1
830
Youtube like BottomNavigation
kobitokaba
0
220
Modularizing and Refactoring Android App with Clean Architecture
kobitokaba
0
260
Slice Your App
kobitokaba
2
1.2k
Inside Jetpack
kobitokaba
2
130
Generating and Transforming Kotlin code
kobitokaba
0
96
Conference Tourism
kobitokaba
0
260
Inside Jetpack Architecture Components
kobitokaba
0
220
Kotlinもう一歩
kobitokaba
8
16k
Other Decks in Programming
See All in Programming
PHPカンファレンス関西2025 基調講演
sugimotokei
6
1.1k
『リコリス・リコイル』に学ぶ!! 〜キャリア戦略における計画的偶発性理論と変わる勇気の重要性〜
wanko_it
1
310
抽象化という思考のツール - 理解と活用 - / Abstraction-as-a-Tool-for-Thinking
shin1x1
1
950
MCPで実現できる、Webサービス利用体験について
syumai
7
2.4k
なぜあなたのオブザーバビリティ導入は頓挫するのか
ryota_hnk
5
580
ワープロって実は計算機で
pepepper
2
1.2k
QA x AIエコシステム段階構築作戦
osu
0
250
構文解析器入門
ydah
7
2k
Jakarta EE Meets AI
ivargrimstad
0
620
マイコンでもRustのtestがしたい その2/KernelVM Tokyo 18
tnishinaga
2
1.6k
Amazon Q CLI開発で学んだAIコーディングツールの使い方
licux
3
180
実践!App Intents対応
yuukiw00w
1
220
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.4k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
880
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
283
13k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Art, The Web, and Tiny UX
lynnandtonic
301
21k
We Have a Design System, Now What?
morganepeng
53
7.7k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.6k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
21
1.4k
Transcript
Inside Architecture Components Yahoo! JAPAN / 森 洋之
About me 森 洋之 @moridroid Yahoo! JAPAN Androidアプリ黒帯 (こういうところで話す仕事)
About me 森 洋之 @moridroid Yahoo! JAPAN Androidアプリ黒帯 (こういうところで話す仕事) ヤフオク!のアプリ担当
About me 森 洋之 @moridroid Yahoo! JAPAN Androidアプリ黒帯 (こういうところで話す仕事) ヤフオク!のアプリ担当 Yahoo! JAPANブースで本を配っています
About me 森 洋之 @moridroid Yahoo! JAPAN Androidアプリ黒帯 (こういうところで話す仕事) ヤフオク!のアプリ担当 Yahoo! JAPANブースで本を配っています
(おすすめしません)
今日の話のまとめ
今日の話のまとめ ・Lifecycle matters
今日の話のまとめ ・Lifecycle is matter ・各コンポーネント紹介
今日の話のまとめ ・Lifecycle is matter ・各コンポーネント紹介 ・どう動いているか
今日の話のまとめ ・Lifecycle is matter ・各コンポーネント紹介 ・どう動いているか ・どう付き合っていくか
Architecture Components
Why Architecture Components
Why Architecture Components Activity Service BroadcastReceiver ContentProvider
Why Architecture Components Activity Service BroadcastReceiver ContentProvider is
Why Architecture Components Activity Service BroadcastReceiver ContentProvider is
Why Architecture Components MVC 提供:アフロ
Why Architecture Components MVC MVP 提供:アフロ
Why Architecture Components MVC MVP MVVM Flux 提供:アフロ
Why Architecture Components MVC MVP MVVM Flux Clean Architecture 提供:アフロ
Why Architecture Components MVC MVP Flux Clean Architecture 提供:アフロ MVVM
Why Architecture Components 提供:アフロ
Why Architecture Components 提供:アフロ
Why Architecture Components
What’s Architecture Components
Architecture Components ・Lifecycle ・LiveData ・ViewModel ・Room
・Paging
Architecture Components → ライフサイクルイベントを通知する ・Lifecycle ・LiveData ・ViewModel ・Room
・Paging
Architecture Components → ライフサイクルイベントを通知する → 変更を通知してくれるデータホルダー ・Lifecycle ・LiveData
・ViewModel ・Room ・Paging
Architecture Components → ライフサイクルイベントを通知する → 変更を通知してくれるデータホルダー → アクティビティ再生成後もデータを維持する ・Lifecycle ・LiveData
・ViewModel ・Room ・Paging
Architecture Components → ライフサイクルイベントを通知する → 変更を通知してくれるデータホルダー → アクティビティ再生成後もデータを維持する → SQLite用オブジェクトマッパー ・Lifecycle
・LiveData ・ViewModel ・Room ・Paging
Architecture Components → ライフサイクルイベントを通知する → 変更を通知してくれるデータホルダー → アクティビティ再生成後もデータを維持する → SQLite用オブジェクトマッパー → ちょっとずつデータを取り出して
Adapterに流す ・Lifecycle ・LiveData ・ViewModel ・Room ・Paging
Architecture Components → ライフサイクルイベントを通知する → 変更を通知してくれるデータ → アクティビティ再生成後もデータを維持する → SQLite用オブジェクトマッパー → ちょっとずつデータを取り出して
Adapterに流す ・Lifecycle ・LiveData ・ViewModel ・Room ・Paging 今日やるところ
Architecture Components → ライフサイクルイベントを通知する → 変更を通知してくれるデータ → アクティビティ再生成後もデータを維持する → SQLite用オブジェクトマッパー → ちょっとずつデータを取り出して
Adapterに流す ・Lifecycle ・LiveData ・ViewModel ・Room ・Paging 今日やるところ Lifecycleグループ
Lifecycle matters
Lifecycle matters in old days... https://developer.android.com/guide/components/activities/activity-lifecycle.html
Lifecycle matters today Steve Pomeroy https://github.com/xxv/android-lifecycle CC-BY-SA 4.0
Lifecycle matters ・ネットワーク通信して、データとってきたけど 画面回転したから無駄になった
Lifecycle matters ・ネットワーク通信して、データとってきたけど 画面回転したから無駄になった ・ネットワーク通信して、データとってくる途中で 画面回転したら、表示するビューは破棄されてて クラッシュした
Lifecycle matters ・ネットワーク通信して、データとってきたけど 画面回転したから無駄になった ・ネットワーク通信して、データとってくる途中で 画面回転したら、表示するビューは破棄されてて クラッシュした ・というか一般的に、非同期的な処理を行うクラスに ViewやActivityContextをもたせたらダメ
Lifecycle matters ・データの変更を監視してViewを更新させようと したらメモリリークした
Lifecycle matters ・データの変更を監視してViewを更新させようと したらメモリリークした ・変更を検知してViewを更新しようとしたら すでに破棄されてた
Lifecycle matters ・データの変更を監視してViewを更新させようと したらメモリリークした ・変更を検知してViewを更新しようとしたら すでに破棄されてた ・これらに対処したら、onResumeやonPauseが ボイラープレートだらけになった
Lifecycle matters ・ロジックを分離する
例題
例題
例題 一般例
例題 class NetworkStateReceiver(private val callback : (NetworkInfo?) -> Unit) :
BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { val conn = context?.getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager ?: return callback(conn.activeNetworkInfo) } }
class MainActivity : AppCompatActivity() { private lateinit var receiver: NetworkStateReceiver
private lateinit var textView: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) textView = findViewById(R.id.textView) receiver = NetworkStateReceiver { if (it != null && it.isConnected) { textView.text = "online" } else { textView.text = "offline" } } } 例題 override fun onResume() { super.onResume() val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) registerReceiver(receiver, filter) } override fun onPause() { super.onPause() unregisterReceiver(receiver) } }
class MainActivity : AppCompatActivity() { private lateinit var receiver: NetworkStateReceiver
private lateinit var textView: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) textView = findViewById(R.id.textView) receiver = NetworkStateReceiver { if (it != null && it.isConnected) { textView.text = "online" } else { textView.text = "offline" } } } 例題 override fun onResume() { super.onResume() val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) registerReceiver(receiver, filter) } override fun onPause() { super.onPause() unregisterReceiver(receiver) } } Activityのロジックと混在する
class MainActivity : AppCompatActivity() { private lateinit var receiver: NetworkStateReceiver
private lateinit var textView: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) textView = findViewById(R.id.textView) receiver = NetworkStateReceiver { if (it != null && it.isConnected) { textView.text = "online" } else { textView.text = "offline" } } } 例題 override fun onResume() { super.onResume() val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) registerReceiver(receiver, filter) } override fun onPause() { super.onPause() unregisterReceiver(receiver) } } Activityのロジックと混在する Activity / Fragmentごとに書くの嫌
Lifecycle
Lifecycle lifecycleパッケージの中核的なコンポーネント
Lifecycle lifecycleパッケージの中核的なコンポーネント Activity / Fragmentなどのライフサイクルイベント時に処 理を差し挟める
Lifecycle lifecycleパッケージの中核的なコンポーネント Activity / Fragmentなどのライフサイクルイベント時に処 理を差し挟める ActivityLifecycleCallbacks、 FragmentLifecycleCallbacksってあったよね…?
ActivityLifecycleCallbacks Lifecycle
Lifecycle ActivityLifecycleCallbacks →アプリ内の全アクティビティの ライフサイクルイベントを拾う
Lifecycle ActivityLifecycleCallbacks →アプリ内の全アクティビティの ライフサイクルイベントを拾う →こういう目的じゃない
Lifecycle FragmentLifecycleCallbacks →アクティビティ内の全フラグメントの ライフサイクルイベントを拾う →こういう目的じゃない
Lifecycle ・ライフサイクルイベントに関係する処理を Activity / Fragmentから切り離すことができる!
Lifecycle ・ライフサイクルイベントに関係する処理を Activity / Fragmentから切り離すことができる! ・内部実装を読んで面白い!
Lifecyleの仕組み
Lifecycleの仕組み
Lifecycleの仕組み
Lifecycleの仕組み
Lifecycleの仕組み
Lifecycleの仕組み
Lifecycleの仕組み
Lifecycleの仕組み
Lifecycleの仕組み
Lifecycleの仕組み
使いかた
class NetworkObservable(private var activity: Activity?, private val callback : (Connectivity)
-> Unit) : LifecycleObserver { private val receiver = NetworkStateReceiver { if (it != null && it.isConnected) { callback(Connectivity.ONLINE) } else { callback(Connectivity.OFFLINE) } } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun registerReceiver() { val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) activity?.registerReceiver(receiver, filter) } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun unregisterReceiver() { activity?.unregisterReceiver(receiver) } 使いかた @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun release() { activity = null } } enum class Connectivity { OFFLINE, ONLINE }
class NetworkObservable(private var activity: Activity?, private val callback : (Connectivity)
-> Unit) : LifecycleObserver { 〜〜 @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun registerReceiver() { val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) activity?.registerReceiver(receiver, filter) } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun unregisterReceiver() { activity?.unregisterReceiver(receiver) } 〜〜 } 使いかた
class NetworkObservable(private var activity: Activity?, private val callback : (Connectivity)
-> Unit) : LifecycleObserver { 〜〜 @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun registerReceiver() { val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) activity?.registerReceiver(receiver, filter) } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun unregisterReceiver() { activity?.unregisterReceiver(receiver) } 〜〜 } 使いかた
class NetworkObservable(private var activity: Activity?, private val callback : (Connectivity)
-> Unit) : LifecycleObserver { 〜〜 @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun registerReceiver() { val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) activity?.registerReceiver(receiver, filter) } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun unregisterReceiver() { activity?.unregisterReceiver(receiver) } 〜〜 } 使いかた 普通はこうする。作るの楽だから。 interface LifecycleObserver { fun onCreate() {} fun onResume() {} fun onPause() {} fun onDestroy() {} // ... }
class NetworkObservable(private var activity: Activity?, private val callback : (Connectivity)
-> Unit) : LifecycleObserver { 〜〜 @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun registerReceiver() { val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) activity?.registerReceiver(receiver, filter) } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun unregisterReceiver() { activity?.unregisterReceiver(receiver) } 〜〜 } 使いかた
class NetworkObservable(private var activity: Activity?, private val callback : (Connectivity)
-> Unit) : LifecycleObserver { 〜〜 @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun registerReceiver() { val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) activity?.registerReceiver(receiver, filter) } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun unregisterReceiver() { activity?.unregisterReceiver(receiver) } 〜〜 } 使いかた 要らないイベント省略可
class NetworkObservable(private var activity: Activity?, private val callback : (Connectivity)
-> Unit) : LifecycleObserver { 〜〜 @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun registerReceiver() { val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) activity?.registerReceiver(receiver, filter) } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun unregisterReceiver() { activity?.unregisterReceiver(receiver) } 〜〜 } 使いかた 要らないイベント省略可 メソッド名 = 処理内容
class NetworkObservable(private var activity: Activity?, private val callback : (Connectivity)
-> Unit) : LifecycleObserver { 〜〜 @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun registerReceiver() { val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) activity?.registerReceiver(receiver, filter) } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun unregisterReceiver() { activity?.unregisterReceiver(receiver) } 〜〜 } 使いかた 要らないイベント省略可 メソッド名 = 処理内容 複数のメソッドに分割
使いかた class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView = findViewById<TextView>(R.id.textView) val networkObservable = NetworkObservable(this) { if (it == Connectivity.ONLINE) { textView.text = "online" } else { textView.text = "offline" } } lifecycle.addObserver(networkObservable) } }
余談
余談 ・バイトコード変換
余談 class FooObservable() : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun fooMethod() { 〜〜 }
}
余談 class FooObservable() : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun fooMethod() { 〜〜 }
fun onResume() { registerReceiver() } }
余談 ・バイトコード変換 ・Annotation Processor
余談 class FooObservable() : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun fooMethod() { 〜〜 }
}
余談 class FooObservable() : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun fooMethod() { 〜〜 }
} class FooObservableAdapter(private val target : FooObservable) : LifecycleObserver { fun onResume() { target.fooMethod() } }
余談 ・バイトコード変換 ・Annotation Processor ・Reflection
余談 ・バイトコード変換 ・Annotation Processor ・Reflection
余談 ・バイトコード変換 ・Annotation Processor ・Reflection 任意
Lifecyleを追え
Lifecycleを追え class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ 〜〜 lifecycle.addObserver(networkObservable) } }
Lifecycleを追え networkObservable SupportActivity addObserver call method
Lifecycleを追え networkObservable SupportActivity addObserver call method
@Override public void addObserver(@NonNull LifecycleObserver observer) { State initialState =
mState == DESTROYED ? DESTROYED : INITIALIZED; ObserverWithState statefulObserver = new ObserverWithState(observer, initialState); ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver); 〜〜 } Lifecycleを追え
@Override public void addObserver(@NonNull LifecycleObserver observer) { State initialState =
mState == DESTROYED ? DESTROYED : INITIALIZED; ObserverWithState statefulObserver = new ObserverWithState(observer, initialState); ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver); 〜〜 } Lifecycleを追え
static class ObserverWithState { State mState; GenericLifecycleObserver mLifecycleObserver; ObserverWithState(LifecycleObserver observer,
State initialState) { mLifecycleObserver = Lifecycling.getCallback(observer); mState = initialState; } void dispatchEvent(LifecycleOwner owner, Event event) { State newState = getStateAfter(event); mState = min(mState, newState); mLifecycleObserver.onStateChanged(owner, event); mState = newState; } } Lifecycleを追え
static class ObserverWithState { State mState; GenericLifecycleObserver mLifecycleObserver; ObserverWithState(LifecycleObserver observer,
State initialState) { mLifecycleObserver = Lifecycling.getCallback(observer); mState = initialState; } void dispatchEvent(LifecycleOwner owner, Event event) { State newState = getStateAfter(event); mState = min(mState, newState); mLifecycleObserver.onStateChanged(owner, event); mState = newState; } } Lifecycleを追え
static GenericLifecycleObserver getCallback(Object object) { 〜〜 int type = getObserverConstructorType(klass);
if (type == GENERATED_CALLBACK) { 〜〜 return アノテーションプロセッサを使った場合用のクラス } return リフレクションを使う場合のクラス } Lifecycleを追え
public class SupportActivity extends Activity implements LifecycleOwner { 〜〜 @Override
@SuppressWarnings("RestrictedApi") protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); ReportFragment.injectIfNeededIn(this); } 〜〜 } Lifecycleを追え
public class ReportFragment extends Fragment { @Override public void onActivityCreated(Bundle
savedInstanceState) { dispatch(Lifecycle.Event.ON_CREATE); } 〜〜 } Lifecycleを追え
Lifecycleを追え public class ReportFragment extends Fragment { private void dispatch(Lifecycle.Event
event) { 〜〜 if (activity instanceof LifecycleOwner) { Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle(); if (lifecycle instanceof LifecycleRegistry) { ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event); } } } }
Lifecycleを追え ObserverWithState AdapterObserver Adapter FooObserver ReportFragment SupportActivity LifecycleRegistry addObserver attach
dispatch event sync
Lifecycleを追え ReportFragment SupportActivity LifecycleRegistry attach dispatch event
Lifecycleを追え ReportFragment SupportActivity LifecycleRegistry FooObserver addObserver attach dispatch event
Lifecycleを追え ObserverWithState AdapterObserver Adapter FooObserver ReportFragment SupportActivity LifecycleRegistry addObserver attach
dispatch event sync
Lifecycleを追え Subscriber Publisher EventChannel subscribe publish event fire event
LiveData
LiveData ・オブザーバブルなデータホルダー
LiveData ・オブザーバブルなデータホルダー ・Activity / Fragmentのライフサイクルを尊重する
使いかた
class NetworkObservable(private var activity: Activity?, private val callback : (Connectivity)
-> Unit) : LifecycleObserver { private val receiver = NetworkStateReceiver { if (it != null && it.isConnected) { callback(Connectivity.ONLINE) } else { callback(Connectivity.OFFLINE) } } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun registerReceiver() { val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) activity?.registerReceiver(receiver, filter) } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun unregisterReceiver() { activity?.unregisterReceiver(receiver) } 使いかた @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun release() { activity = null } }
class NetworkObservable(private var activity: Activity?) : LifecycleObserver { private val
connectivity = MutableLiveData<Connectivity>() private val receiver = NetworkStateReceiver { if (it != null && it.isConnected) { connectivity.postValue(Connectivity.ONLINE) } else { connectivity.postValue(Connectivity.OFFLINE) } } fun getConnectivity() : LiveData<Connectivity> = connectivity @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun registerReceiver() { val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) activity?.registerReceiver(receiver, filter) } 使いかた @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun unregisterReceiver() { activity?.unregisterReceiver(receiver) } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun release() { activity = null } } }
class NetworkObservable(private var activity: Activity?) : LifecycleObserver { private val
connectivity = MutableLiveData<Connectivity>() private val receiver = NetworkStateReceiver { if (it != null && it.isConnected) { connectivity.postValue(Connectivity.ONLINE) } else { connectivity.postValue(Connectivity.OFFLINE) } } fun getConnectivity() : LiveData<Connectivity> = connectivity 〜〜 } 使いかた
class NetworkObservable(private var activity: Activity?) : LifecycleObserver { private val
connectivity = MutableLiveData<Connectivity>() private val receiver = NetworkStateReceiver { if (it != null && it.isConnected) { connectivity.postValue(Connectivity.ONLINE) } else { connectivity.postValue(Connectivity.OFFLINE) } } fun getConnectivity() : LiveData<Connectivity> = connectivity 〜〜 } 使いかた
class NetworkObservable(private var activity: Activity?) : LifecycleObserver { private val
connectivity = MutableLiveData<Connectivity>() private val receiver = NetworkStateReceiver { if (it != null && it.isConnected) { connectivity.postValue(Connectivity.ONLINE) } else { connectivity.postValue(Connectivity.OFFLINE) } } fun getConnectivity() : LiveData<Connectivity> = connectivity 〜〜 } 使いかた
class NetworkObservable(private var activity: Activity?) : LifecycleObserver { private val
connectivity = MutableLiveData<Connectivity>() private val receiver = NetworkStateReceiver { if (it != null && it.isConnected) { connectivity.postValue(Connectivity.ONLINE) } else { connectivity.postValue(Connectivity.OFFLINE) } } fun getConnectivity() : LiveData<Connectivity> = connectivity 〜〜 } 使いかた
class NetworkObservable(private var activity: Activity?) : LifecycleObserver { private val
connectivity = MutableLiveData<Connectivity>() private val receiver = NetworkStateReceiver { if (it != null && it.isConnected) { connectivity.postValue(Connectivity.ONLINE) } else { connectivity.postValue(Connectivity.OFFLINE) } } fun getConnectivity() : LiveData<Connectivity> = connectivity 〜〜 } 使いかた
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) {
〜〜 val observable = NetworkObservable(this) observable.getConnectivity().observe(this, Observer<Connectivity> { if (it == Connectivity.ONLINE) { textView.text = "online" } else { textView.text = "offline" } }) lifecycle.addObserver(observable) } } 使いかた
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) {
〜〜 val observable = NetworkObservable(this) observable.getConnectivity().observe(this, Observer<Connectivity> { if (it == Connectivity.ONLINE) { textView.text = "online" } else { textView.text = "offline" } }) lifecycle.addObserver(observable) } } 使いかた
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) {
〜〜 val observable = NetworkObservable(this) observable.getConnectivity().observe(this, Observer<Connectivity> { if (it == Connectivity.ONLINE) { textView.text = "online" } else { textView.text = "offline" } }) lifecycle.addObserver(observable) } } 使いかた
LiveDataを追え
LiveDataを追え class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?)
{ 〜〜 val observable = NetworkObservable(this) observable.getConnectivity().observe(this, Observer<Connectivity> { if (it == Connectivity.ONLINE) { textView.text = "online" } else { textView.text = "offline" } }) lifecycle.addObserver(observable) } }
LiveData public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
〜〜 LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer); ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper); 〜〜 owner.getLifecycle().addObserver(wrapper); }
LiveData public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
〜〜 LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer); ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper); 〜〜 owner.getLifecycle().addObserver(wrapper); }
LiveData public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
〜〜 LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer); ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper); 〜〜 owner.getLifecycle().addObserver(wrapper); }
LiveData class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver { 〜〜 @Override
boolean shouldBeActive() { return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED); } 〜〜 }
LiveData protected void setValue(T value) { assertMainThread("setValue"); mVersion++; mData =
value; dispatchingValue(null); }
LiveData protected void setValue(T value) { assertMainThread("setValue"); mVersion++; mData =
value; dispatchingValue(null); }
Lifecycleを追え LifecycleBoundObserver FooObserver addObserver sync LifecycleOwner LiveData observe dispatch
Lifecycleを追え FooObserver LifecycleOwner LiveData observe
Lifecycleを追え LifecycleBoundObserver FooObserver LifecycleOwner LiveData observe
Lifecycleを追え LifecycleBoundObserver FooObserver addObserver LifecycleOwner LiveData observe
Lifecycleを追え LifecycleBoundObserver FooObserver addObserver LiveData observe sync LifecycleOwner
Lifecycleを追え LifecycleBoundObserver FooObserver addObserver LiveData observe sync LifecycleOwner dispatch
ViewModel
・retained FragmentにViewModelを持たせる ViewModel
・retained FragmentにViewModelを持たせる ・Activityが再生成しても、 retained Fragmentはインスタンスを維持する ViewModel
・retained FragmentにViewModelを持たせる ・Activityが再生成しても、 retained Fragmentはインスタンスを維持する ・そのため、ViewModelも破棄されない ViewModel
ViewModel ・retained FragmentにViewModelを持たせる ・Activityが再生成しても、 retained Fragmentはインスタンスを維持する ・そのため、ViewModelも破棄されない ・以上!
使いかた
・ActivityのContextやViewを持たせてはダメ 注意点
・ActivityのContextやViewを持たせてはダメ ・同一のViewModelクラスは、 アクティビティ内で1インスタンス 注意点
・ActivityのContextやViewを持たせてはダメ ・同一のViewModelクラスは、 アクティビティ内で1インスタンス 注意点
使いかた class NetworkObservable(private var activity: Activity?, private val callback :
(Connectivity) -> Unit) : LifecycleObserver { private val receiver = NetworkStateReceiver { if (it != null && it.isConnected) { callback(Connectivity.ONLINE) } else { callback(Connectivity.OFFLINE) } } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun registerReceiver() { val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) activity?.registerReceiver(receiver, filter) } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun unregisterReceiver() { activity?.unregisterReceiver(receiver) } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun release() { activity = null } } enum class Connectivity { OFFLINE, ONLINE }
使いかた class NetworkViewModel : ViewModel() { val connectivity = MutableLiveData<Connectivity>()
}
使いかた class NetworkViewModel : ViewModel() { val connectivity = MutableLiveData<Connectivity>()
}
使いかた class NetworkViewModel : ViewModel() { val connectivity = MutableLiveData<Connectivity>()
}
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView = findViewById<TextView>(R.id.textView) val viewModel = ViewModelProviders.of(this).get(NetworkViewModel::class.java) viewModel.connectivity.observe(this, Observer<Connectivity> { when(it) { Connectivity.ONLINE -> textView.text = "online" Connectivity.OFFLINE -> textView.text = "offline" } }) val networkObservable = NetworkObservable(this) { viewModel.connectivity.postValue(it) } lifecycle.addObserver(networkObservable) } } 使いかた
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView = findViewById<TextView>(R.id.textView) val viewModel = ViewModelProviders.of(this).get(NetworkViewModel::class.java) viewModel.connectivity.observe(this, Observer<Connectivity> { when(it) { Connectivity.ONLINE -> textView.text = "online" Connectivity.OFFLINE -> textView.text = "offline" } }) val networkObservable = NetworkObservable(this) { viewModel.connectivity.postValue(it) } lifecycle.addObserver(networkObservable) } } 使いかた
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView = findViewById<TextView>(R.id.textView) val viewModel = ViewModelProviders.of(this).get(NetworkViewModel::class.java) viewModel.connectivity.observe(this, Observer<Connectivity> { when(it) { Connectivity.ONLINE -> textView.text = "online" Connectivity.OFFLINE -> textView.text = "offline" } }) val networkObservable = NetworkObservable(this) { viewModel.connectivity.postValue(it) } lifecycle.addObserver(networkObservable) } } 使いかた
ViewModelを追え
追いません
まとめ
まとめ ・Architecture Components誕生の背景
まとめ ・Architecture Components誕生の背景 ・Lifecycle Matters
まとめ ・Architecture Components誕生の背景 ・Lifecycle Matters ・各コンポーネントの使いかた
まとめ ・Architecture Components誕生の背景 ・Lifecycle Matters ・各コンポーネントの使いかた ・と、その仕組
Thank you