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.7k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Inside Architecture Components
Lifecycle, LiveData, ViewModelの使いかたとその仕組みについて
kobito-kaba
February 07, 2018
More Decks by kobito-kaba
See All by kobito-kaba
新規プロジェクトでやってよかったことまとめ
kobitokaba
1
910
Youtube like BottomNavigation
kobitokaba
0
270
Modularizing and Refactoring Android App with Clean Architecture
kobitokaba
0
300
Slice Your App
kobitokaba
2
1.3k
Inside Jetpack
kobitokaba
2
170
Generating and Transforming Kotlin code
kobitokaba
0
140
Conference Tourism
kobitokaba
0
290
Inside Jetpack Architecture Components
kobitokaba
0
250
Kotlinもう一歩
kobitokaba
8
17k
Other Decks in Programming
See All in Programming
RTSPクライアントを自作してみた話
simotin13
0
630
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
130
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.4k
OSもどきOS
arkw
0
590
Creating Composable Callables in Contemporary C++
rollbear
0
160
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
220
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
370
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
120
AIで効率化できた業務・日常
ochtum
0
140
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
610
Lessons from Spec-Driven Development
simas
PRO
0
220
Featured
See All Featured
Test your architecture with Archunit
thirion
1
2.3k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
4 Signs Your Business is Dying
shpigford
187
22k
Statistics for Hackers
jakevdp
799
230k
Designing for Timeless Needs
cassininazir
1
260
Making Projects Easy
brettharned
120
6.7k
Practical Orchestrator
shlominoach
191
11k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Being A Developer After 40
akosma
91
590k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
780
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
300
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