Slide 1

Slide 1 text

Android Architecture Componentͷ LifecyleରԠίϯϙʔωϯτͷ ͓͞Β͍ Androidݚڀ&ൃදձ #4 2020/01/25

Slide 2

Slide 2 text

• Տຊ ହ޹(͔Θ΋ͱ ΍͔ͨ͢) • ॴଐɿגࣜձࣾ tech vein 
 (େࡕࢢதԝ۠ຊொ) • ϞόΠϧΞϓϦΤϯδχΞ
 (AndroidଟΊɺiOS΋ŧŔŕŪũƄŝſ) • GitHub: kwmt ɺtwitter: kwmt27 • Google I/O2018 ॳࢀՃ • ෱Ԭग़਎ • ΫϥϑτϏʔϧ޷͖ ࣗݾ঺հ

Slide 3

Slide 3 text

• Android Architecture Componentͱ͸ʁ • ViewModelͰ؆୯ը໘ճస • LiveDataΛ࢖ͬͯUIΛߋ৽ • LifecycleͰActivity΍FragmentΛεοΩϦ • ViewModelͷڞ༗ • Tips • ·ͱΊ ΞδΣϯμ

Slide 4

Slide 4 text

Android Architecture Componentͱ͸ https://www.youtube.com/watch?v=LmkKFCfmnhQ&feature=youtu.be&hl=ja

Slide 5

Slide 5 text

Android Architecture Componentͱ͸ https://www.youtube.com/watch?v=pErTyQpA390

Slide 6

Slide 6 text

ViewModel, LiveData, Lifecycle ࠓ೔ͷओ໾

Slide 7

Slide 7 text

ViewModelͰ؆୯ը໘ճస

Slide 8

Slide 8 text

՝୊ Activity ViewModelΛ࢖Θͣ ࣮૷ͨ͠৔߹ ը໘ճసͷͱ͖ɺ ʢͳʹ΋͠ͳ͍ͱʣ λΠϚʔ͕ΫϦΞ͞ΕΔ ※savedInstanceStateΛ࢖͑͹ ΫϦΞ͞Εͳ͍Α͏ʹ͢Δ͜ͱ͸Ͱ͖·͕͢ɺ ͜͜Ͱ͸ߟ͑·ͤΜɻ ྫɿλΠϚʔΞϓϦ

Slide 9

Slide 9 text

՝୊ Activity ViewModelΛ࢖Θͣ ࣮૷ͨ͠৔߹ ը໘ճసͷͱ͖ɺ ʢͳʹ΋͠ͳ͍ͱʣ λΠϚʔ͕ΫϦΞ͞ΕΔ ※savedInstanceStateΛ࢖͑͹ ΫϦΞ͞Εͳ͍Α͏ʹ͢Δ͜ͱ͸Ͱ͖·͕͢ɺ ͜͜Ͱ͸ߟ͑·ͤΜɻ ྫɿλΠϚʔΞϓϦ

Slide 10

Slide 10 text

ViewModelΛ࢖͏ͱ Activity viewModel ը໘ճసͷͱ͖ɺ λΠϚʔ͕ΫϦΞ͞Εͳ͍Α͏ʹ ؆୯ʹͰ͖Δ ViewModel timer

Slide 11

Slide 11 text

ViewModelΛ࢖͏ͱ Activity viewModel ը໘ճసͷͱ͖ɺ λΠϚʔ͕ΫϦΞ͞Εͳ͍Α͏ʹ ؆୯ʹͰ͖Δ ViewModel timer

Slide 12

Slide 12 text

ViewModelͷੜଘظؒ ࣌ؒ Activity ViewModel

Slide 13

Slide 13 text

ViewModelͷੜଘظؒ ࣌ؒ ىಈ Activity ViewModel

Slide 14

Slide 14 text

ViewModelͷੜଘظؒ onCreate ࣌ؒ ViewModelੜ੒ onStart onResume ىಈ Activity ViewModel

Slide 15

Slide 15 text

ViewModelͷੜଘظؒ onCreate ࣌ؒ ViewModelੜ੒ onStart onResume ىಈ ճస Activity ViewModel

Slide 16

Slide 16 text

ViewModelͷੜଘظؒ onCreate ࣌ؒ ViewModelੜ੒ onStart onResume onPause onStop onDestroy onCreate onStart onResume ىಈ ճస Activity ViewModel

Slide 17

Slide 17 text

ViewModelͷੜଘظؒ onCreate ࣌ؒ ViewModelੜ੒ onStart onResume onPause onStop onDestroy onCreate onStart onResume ىಈ ճస όοΫΩʔͰΞϓϦऴྃ Activity ViewModel

Slide 18

Slide 18 text

ViewModelͷੜଘظؒ onCreate ࣌ؒ ViewModelੜ੒ onStart onResume onPause onStop onDestroy onCreate onStart onResume onPause onStop onDestroy ىಈ ճస όοΫΩʔͰΞϓϦऴྃ onCleared Activity ViewModel

Slide 19

Slide 19 text

ViewModelͷੜଘظؒ onCreate ࣌ؒ ViewModelੜ੒ onStart onResume onPause onStop onDestroy onCreate onStart onResume onPause onStop onDestroy ىಈ ճస όοΫΩʔͰΞϓϦऴྃ onCleared Activity ViewModel

Slide 20

Slide 20 text

override fun onCreate(savedInstanceState: Bundle?) { // লུ val chronometer = findViewById(R.id.chronometer) val startTime = viewModel.startTime if (startTime == null) { val time = SystemClock.elapsedRealtime() viewModel.startTime = time chronometer.base = time } else { chronometer.base = startTime } chronometer.start() } Activity class ChronoViewModel: ViewModel() { var startTime: Long? = null } ViewModel

Slide 21

Slide 21 text

• Kotlin ϓϩύςΟσϦήʔτΛ࢖͏ํ๏ ViewModelΠϯελϯεͷऔಘํ๏ (஫ҙ)fragment-ktxͷ1.1.0Ҏ্Λ࢖͏ඞཁ͋Γ val viewModel by viewModels() https://developer.android.com/jetpack/androidx/releases/lifecycle#2.2.0-alpha03 ViewModelProviders.of(this) .get(MyViewModel::class.java) • ViewModelProviderΛ࢖͏ํ๏ viewModel = ViewModelProvider(this) .get(MyViewModel::class.java)

Slide 22

Slide 22 text

• Kotlin ϓϩύςΟσϦήʔτΛ࢖͏ํ๏ ViewModelΠϯελϯεͷऔಘํ๏ (஫ҙ)fragment-ktxͷ1.1.0Ҏ্Λ࢖͏ඞཁ͋Γ val viewModel by viewModels() https://developer.android.com/jetpack/androidx/releases/lifecycle#2.2.0-alpha03 ViewModelProviders.of(this) .get(MyViewModel::class.java) • ViewModelProviderΛ࢖͏ํ๏ viewModel = ViewModelProvider(this) .get(MyViewModel::class.java) 2.2.0-alpha03͔ΒDeprecated

Slide 23

Slide 23 text

• Activity΍FragmentͷϥΠϑαΠΫϧશମͰσʔλΛอ࣋ Ͱ͖Δ • Activity΍FragmentΑΓੜଘظ͕ؒ௕͍ΦϒδΣΫτ • ViewModelΫϥεͷ࡞੒͸ɺViewModel()Λܧঝ͢Δ͚ͩ • ViewModelΠϯελϯεΛऔಘ͢Δʹ͸ɺ
 KotlinϓϩύςΟσϦήʔτͱViewModelProviderΛ࢖͏ ํ๏͕͋Δ ViewModel ·ͱΊ

Slide 24

Slide 24 text

LiveDataΛ࢖ͬͯUIΛߋ৽

Slide 25

Slide 25 text

• ઌఔͷλΠϚʔΞϓϦͰɺ
 UIΛ1ඵִؒͰ
 ʮʙඵܦաʯ
 ͱද͍ࣔͨ͠ • ͔ͭɺը໘ճస΋ߟྀ͍ͨ͠ ͜͜Ͱղܾ͍ͨ͠՝୊

Slide 26

Slide 26 text

• ઌఔͷλΠϚʔΞϓϦͰɺ
 UIΛ1ඵִؒͰ
 ʮʙඵܦաʯ
 ͱද͍ࣔͨ͠ • ͔ͭɺը໘ճస΋ߟྀ͍ͨ͠ ͜͜Ͱղܾ͍ͨ͠՝୊

Slide 27

Slide 27 text

ViewModelʹߋ৽͍ͨ͠ViewΛ ࣋ͨͤͨΒ͍͍Μ͡Όʁ class MyViewModel : ViewModel() { val initialTime = SystemClock.elapsedRealtime() private val timer = Timer() var timerTextView: TextView? = null init{ timer.scheduleAtFixedRate(object : TimerTask() { override fun run() { timerTextView?.text = "$ඵ਺ ඵܦա" } }, 1000, 1000) } }

Slide 28

Slide 28 text

ViewModelʹߋ৽͍ͨ͠ViewΛ ࣋ͨͤͨΒ͍͍Μ͡Όʁ class MyViewModel : ViewModel() { val initialTime = SystemClock.elapsedRealtime() private val timer = Timer() var timerTextView: TextView? = null init{ timer.scheduleAtFixedRate(object : TimerTask() { override fun run() { timerTextView?.text = "$ඵ਺ ඵܦա" } }, 1000, 1000) } } • ΞϓϦऴྃ࣌ʹϝϞϦϦʔΫ͢ΔͷͰɺͰ͖·ͤΜɻ

Slide 29

Slide 29 text

ViewModelʹߋ৽͍ͨ͠ViewΛ ࣋ͨͤͨΒ͍͍Μ͡Όʁ class MyViewModel : ViewModel() { val initialTime = SystemClock.elapsedRealtime() private val timer = Timer() var timerTextView: TextView? = null init{ timer.scheduleAtFixedRate(object : TimerTask() { override fun run() { timerTextView?.text = "$ඵ਺ ඵܦա" } }, 1000, 1000) } } • ΞϓϦऴྃ࣌ʹϝϞϦϦʔΫ͢ΔͷͰɺͰ͖·ͤΜɻ AACͷLiveDataΛ࢖͍·͢ʂ

Slide 30

Slide 30 text

LiveDataΛ࢖͏ class MyViewModel : ViewModel() { val initialTime = SystemClock.elapsedRealtime() private val timer = Timer() private val elapsedTime = MutableLiveData() fun getElapsedTime(): LiveData = elapsedTime init{ timer.scheduleAtFixedRate(object : TimerTask() { override fun run() { elapsedTime.postValue(ඵ਺) } }, 1000, 1000) } } viewModel.getElapsedTime()
 .observe(this, Observer { timerTextView.text = "${t}ඵܦա" }) • Activityଆ

Slide 31

Slide 31 text

LiveDataΛ࢖͏ class MyViewModel : ViewModel() { val initialTime = SystemClock.elapsedRealtime() private val timer = Timer() private val elapsedTime = MutableLiveData() fun getElapsedTime(): LiveData = elapsedTime init{ timer.scheduleAtFixedRate(object : TimerTask() { override fun run() { elapsedTime.postValue(ඵ਺) } }, 1000, 1000) } } viewModel.getElapsedTime()
 .observe(this, Observer { timerTextView.text = "${t}ඵܦա" }) • Activityଆ

Slide 32

Slide 32 text

LiveDataΛ࢖͏ ViewModel Activity viewModel elapsedTime timerTextView.text

Slide 33

Slide 33 text

LiveDataΛ࢖͏ ViewModel Activity viewModel elapsedTime observeͰ؂ࢹ timerTextView.text

Slide 34

Slide 34 text

LiveDataΛ࢖͏ ViewModel Activity viewModel elapsedTime observeͰ؂ࢹ 1ඵ͝ͱʹߋ৽ timerTextView.text

Slide 35

Slide 35 text

LiveDataΛ࢖͏ ViewModel Activity viewModel elapsedTime observeͰ؂ࢹ 1ඵ͝ͱʹߋ৽ timerTextView.text ௨஌

Slide 36

Slide 36 text

• ViewModelʹViewΛ࣋ͨͤΔͷ͸ɺ
 ϝϞϦϦʔΫ͢ΔͷͰμϝ • ViewModelʹLiveDataΛ࣋ͨͤͯɺActivity΍Fragment͔ Β؂ࢹ(observe)͠ɺViewModel͔Β௨஌͢Δ LiveData ·ͱΊ

Slide 37

Slide 37 text

LifecycleͰActivity΍FragmentΛεοΩϦ

Slide 38

Slide 38 text

• ͨͱ͑͹ɺݱࡏ஍Λऔಘ͢ΔͨΊʹɺ LocationManager Λ࢖͏ͱ͠·͢ɻ
 ͜ͷΑ͏ͳAPIΛ࢖͏ͨΊʹ͸ɺ
 onResumeͰॳظԽɾsubscribeͨ͠Γ
 onPauseͰετοϓͨ͠Γɺunsubscribe͢Δ͜ͱ͕ඞཁ Ͱ͢ɻ ͜͜Ͱղܾ͍ͨ͠՝୊

Slide 39

Slide 39 text

͜͜Ͱղܾ͍ͨ͠՝୊ Activity override fun onResume(){ locationManager.requestLocationUpdates(লུ) } override fun onPause(){ locationManager.removeUpdates(লུ) } • AndroidͷϥΠϒϥϦ΍API͸͜ͷΑ͏ͳॲཧΛ͢Δ΋ͷ ͕ଟ͍ͷͰɺActivity΍FragmentΫϥε͕๲ΒΜͰ͖ͯɺ ಡΈʹ͘͘ͳΓ·͢ɻ

Slide 40

Slide 40 text

Activity override fun onCreate(){ LocationLifecyle(this) } Lifecycle class LocationLifecycle(lifecycleOwner: LifecycleOwner) ɹɹɹ: LifecycleObserver { init { lifecycleOwner.lifecycle.addObserver(this) } @OnLifecycleEvent(ON_RESUME) fun addLocationListener() { locationManager.requestLocationUpdates(লུ) } @OnLifecycleEvent(ON_PAUSE) fun removeLocationListener() { locationManager.removeUpdates(লུ) } }

Slide 41

Slide 41 text

Activity override fun onCreate(){ LocationLifecyle(this) } Lifecycle class LocationLifecycle(lifecycleOwner: LifecycleOwner) ɹɹɹ: LifecycleObserver { init { lifecycleOwner.lifecycle.addObserver(this) } @OnLifecycleEvent(ON_RESUME) fun addLocationListener() { locationManager.requestLocationUpdates(লུ) } @OnLifecycleEvent(ON_PAUSE) fun removeLocationListener() { locationManager.removeUpdates(লུ) } } interfaceΛ࣮૷

Slide 42

Slide 42 text

Activity override fun onCreate(){ LocationLifecyle(this) } Lifecycle class LocationLifecycle(lifecycleOwner: LifecycleOwner) ɹɹɹ: LifecycleObserver { init { lifecycleOwner.lifecycle.addObserver(this) } @OnLifecycleEvent(ON_RESUME) fun addLocationListener() { locationManager.requestLocationUpdates(লུ) } @OnLifecycleEvent(ON_PAUSE) fun removeLocationListener() { locationManager.removeUpdates(লུ) } } interfaceΛ࣮૷ observerΛొ࿥

Slide 43

Slide 43 text

Activity override fun onCreate(){ LocationLifecyle(this) } Lifecycle class LocationLifecycle(lifecycleOwner: LifecycleOwner) ɹɹɹ: LifecycleObserver { init { lifecycleOwner.lifecycle.addObserver(this) } @OnLifecycleEvent(ON_RESUME) fun addLocationListener() { locationManager.requestLocationUpdates(লུ) } @OnLifecycleEvent(ON_PAUSE) fun removeLocationListener() { locationManager.removeUpdates(লུ) } } interfaceΛ࣮૷ observerΛొ࿥ ϥΠϑαΠΫϧʹґ ଘ͍ͨ͠ϝιουʹ ΞϊςʔγϣϯΛͭ ͚Δ

Slide 44

Slide 44 text

• AndroidϥΠϑαΠΫϧʹؔΘΔAPI΍ϥΠϒϥϦΛ࢖͏ ࣌ʹɺAAC LifecycleΛ࢖͏ͱActivity΍FragmentҎ֎ͷ ΫϥεͰϥΠϑαΠΫϧݕ஌͕Ͱ͖Δɻ Lifecycle ·ͱΊ

Slide 45

Slide 45 text

ViewModelͷڞ༗

Slide 46

Slide 46 text

• Fragment͔ΒActivityʹͳʹ͔௨஌͍ͨͬͯ͠໘౗ͩͬͨ ΑͶʁ ͜͜Ͱղܾ͍ͨ͠՝୊

Slide 47

Slide 47 text

class FugaFragment : Fragment() { interface OnClickListener { fun onClick() } private var onClickListener: OnClickListener? = null // লུ override fun onActivityCreated { // লུ onClickListener = requireActivity() as? OnClickListener // ϘλϯͳͲͷΫϦοΫΠϕϯτͰonClickΛݺͿ onClickListener?.onClick() } } class HogeActivity : AppCompatActivity(), FugaFragment.OnClickListener { // লུ override fun onClick() { // ͳʹ͔ } }

Slide 48

Slide 48 text

class FugaFragment : Fragment() { interface OnClickListener { fun onClick() } private var onClickListener: OnClickListener? = null // লུ override fun onActivityCreated { // লུ onClickListener = requireActivity() as? OnClickListener // ϘλϯͳͲͷΫϦοΫΠϕϯτͰonClickΛݺͿ onClickListener?.onClick() } } class HogeActivity : AppCompatActivity(), FugaFragment.OnClickListener { // লུ override fun onClick() { // ͳʹ͔ } } ௨஌༻interfaceΛఆٛ ϑΟʔϧυʹม਺༻ҙ Activity͕interfaceΛ࣮૷ͯͨ͠ΒΩϟετ ௨஌༻ͷinterfaceΛ࣮૷

Slide 49

Slide 49 text

• ActivityͱFragmentͰViewModelΛڞ༗ͯ͠ɺ
 ಉ͜͡ͱΛ΍ͬͯΈΔ ViewModelΛڞ༗

Slide 50

Slide 50 text

class HogeActivity : AppCompatActivity() { private val viewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { // লུ viewModel.clickEvent.observe(this) { textView.text = it } } } private val viewModel by viewModels ({ requireActivity() }) viewModel.onClick() class HogeViewModel : ViewModel() { val clickEvent = MutableLiveData() fun onClick() { clickEvent.value = "Ϙλϯ͕ԡ͞ΕͨΑ" } }

Slide 51

Slide 51 text

͜ΕΛಈ͔͢ͱ

Slide 52

Slide 52 text

͜ΕΛಈ͔͢ͱ

Slide 53

Slide 53 text

• Fragment͔ΒActivity΁ͷ௨஌͕؆୯ • (͜͜Ͱ͸આ໌ͯ͠·ͤΜ͕)Fragmentಉ࢜ͷڞ༗΋Մೳ ViewModelڞ༗ͷ·ͱΊ

Slide 54

Slide 54 text

͜͜·Ͱ͸΄΅Codelabͷ಺༰ https://codelabs.developers.google.com/codelabs/android-lifecycles/#0

Slide 55

Slide 55 text

Tips

Slide 56

Slide 56 text

• 2ͭͷLiveDataΛ݁߹͍ͨ͠ • LiveDataͷൃՐΛҰ౓͚ͩʹ͍ͨ͠ Tips

Slide 57

Slide 57 text

• 2ͭͷLiveDataΛ݁߹͍ͨ͠ • LiveDataͷൃՐΛҰ౓͚ͩʹ͍ͨ͠ Tips

Slide 58

Slide 58 text

2ͭͷLiveDataΛ݁߹͍ͨ͠

Slide 59

Slide 59 text

MediatorLiveDataΛ࢖͏ class ZipLIveDataViewModel : ViewModel() { val editText1 = MutableLiveData() val editText2 = MutableLiveData() val isEnabled = MediatorLiveData() init { val observer = Observer { isEnabled.value = editText1.value?.isNotEmpty() ?: false && editText2.value?.isNotEmpty() ?: false } isEnabled.addSource(editText1, observer) isEnabled.addSource(editText2, observer) } }

Slide 61

Slide 61 text

MediatorLiveDataͷϥούʔؔ਺Λ࢖͏ class ZipLIveDataViewModel : ViewModel() { val editText1 = MutableLiveData() val editText2 = MutableLiveData() val isEnabled: LiveData = zipLiveData(editText1, editText2) .map { (t1, t2) -> t1.isNotEmpty() && t2.isNotEmpty() } }

Slide 62

Slide 62 text

ൺ΂Δ class ZipLIveDataViewModel : ViewModel() { val editText1 = MutableLiveData() val editText2 = MutableLiveData() val isEnabled: LiveData = zipLiveData(editText1, editText2) .map { (t1, t2) -> t1.isNotEmpty() && t2.isNotEmpty() } } class ZipLIveDataViewModel : ViewModel() { val editText1 = MutableLiveData() val editText2 = MutableLiveData() val isEnabled = MediatorLiveData() init { val observer = Observer { isEnabled.value = editText1.value?.isNotEmpty() ?: false && editText2.value?.isNotEmpty() ?: false } isEnabled.addSource(editText1, observer) isEnabled.addSource(editText2, observer) } }

Slide 63

Slide 63 text

ಈ͔͢

Slide 64

Slide 64 text

ಈ͔͢

Slide 65

Slide 65 text

• 2ͭͷLiveDataΛ݁߹͍ͨ͠ • LiveDataͷൃՐΛҰ౓͚ͩʹ͍ͨ͠ Tips

Slide 66

Slide 66 text

• ը໘ભҠʹLiveDataΛ࢖͏ͱɺ໭Δ͜ͱ͕Ͱ͖ͳ͍ LiveDataͷൃՐΛҰ౓͚ͩʹ͍ͨ͠

Slide 67

Slide 67 text

ભҠݩʹ໭Εͳ͍࣮૷ྫ override fun onViewCreated() { viewModel.nextLiveData .observe(viewLifecycleOwner) { nextViewType -> // ը໘ભҠ͢Δ } button .setOnClickListener{viewModel.onClickNextButton()}
 } fun onClickNextButton() { // APIϨεϙϯεͷ݁ՌʹΑͬͯɺը໘ભҠΛม͍͑ͨ৔߹ val data = repository.fetchData() // লུ _nextLiveData.value = nextType } Fragment ViewModel

Slide 68

Slide 68 text

ભҠݩʹ໭Εͳ͍࣮૷ྫ override fun onViewCreated() { viewModel.nextLiveData .observe(viewLifecycleOwner) { nextViewType -> // ը໘ભҠ͢Δ } button .setOnClickListener{viewModel.onClickNextButton()}
 } fun onClickNextButton() { // APIϨεϙϯεͷ݁ՌʹΑͬͯɺը໘ભҠΛม͍͑ͨ৔߹ val data = repository.fetchData() // লུ _nextLiveData.value = nextType } Fragment ViewModel όοΫͰ໭͖ͬͯͨͱ͖ʹɺ onViewCreated͕ݺ͹Εͯɺ observe͍ͯ͠ΔonChanged͕ݺ͹ΕΔͨΊ

Slide 69

Slide 69 text

LiveDataͷϥούʔΫϥεΛ࡞Δ https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150 data class Event(private val content: T) { var hasBeenHandled = false private set fun getContentIfNotHandled(): T? { return if (hasBeenHandled) { null } else { hasBeenHandled = true content } } }

Slide 70

Slide 70 text

LiveDataͷϥούʔΫϥε(Event)Λ࢖͏ override fun onViewCreated() { viewModel.nextLiveData .observe(viewLifecycleOwner) { event -> event.getContentIfNotHandled()?.let {nextViewType -> // ը໘ભҠ͢Δ
 } } button .setOnClickListener{viewModel.onClickNextButton()}
 } fun onClickNextButton() { // APIϨεϙϯεͷ݁ՌʹΑͬͯɺը໘ભҠΛม͍͑ͨ৔߹ val data = repository.fetchData() // লུ _nextLiveData.value = Event(nextType) } Fragment ViewModel

Slide 71

Slide 71 text

LiveDataͷϥούʔΫϥε(Event)Λ࢖͏ override fun onViewCreated() { viewModel.nextLiveData .observe(viewLifecycleOwner) { event -> event.getContentIfNotHandled()?.let {nextViewType -> // ը໘ભҠ͢Δ
 } } button .setOnClickListener{viewModel.onClickNextButton()}
 } fun onClickNextButton() { // APIϨεϙϯεͷ݁ՌʹΑͬͯɺը໘ભҠΛม͍͑ͨ৔߹ val data = repository.fetchData() // লུ _nextLiveData.value = Event(nextType) } Fragment ViewModel EventΛηοτ͢ΔΑ͏ʹมߋ

Slide 72

Slide 72 text

LiveDataͷϥούʔΫϥε(Event)Λ࢖͏ override fun onViewCreated() { viewModel.nextLiveData .observe(viewLifecycleOwner) { event -> event.getContentIfNotHandled()?.let {nextViewType -> // ը໘ભҠ͢Δ
 } } button .setOnClickListener{viewModel.onClickNextButton()}
 } fun onClickNextButton() { // APIϨεϙϯεͷ݁ՌʹΑͬͯɺը໘ભҠΛม͍͑ͨ৔߹ val data = repository.fetchData() // লུ _nextLiveData.value = Event(nextType) } Fragment ViewModel getContentIfNotHandled()ͷ࢓૊ΈͰɺ όοΫͰ໭͖ͬͯͨͱ͖͸null͕ฦΔ ͨΊɺը໘ભҠ͠ͳ͘ͳΓɺ ݩͷը໘ʹ໭Δ͜ͱ͕Ͱ͖Δ EventΛηοτ͢ΔΑ͏ʹมߋ

Slide 73

Slide 73 text

ಈ͔͢

Slide 74

Slide 74 text

ಈ͔͢

Slide 75

Slide 75 text

• Activity΍Fragment͕ը໘ճసͳͲͰ࠶ੜ੒͞Εͯ΋อ͓͖࣋ͯͨ͠ ͍৘ใΛViewModelʹอ࣋͢Δͱ޾ͤʹͳΔ • ViewModelͰܭࢉͨ͠Γอ࣋ͨ͠σʔλͰUIΛߋ৽͢Δʹ͸ɺ LiveDataΛ࢖ͬͯUIʹ௨஌͢Δɻ • AACͷLifecycle͸Activity΍FragmentͷϥΠϑαΠΫϧͰॳظԽ΍ഁغ Λ͍ͯͨ͠ίϯϙʔωϯτΛɺผΫϥεʹ੾Γग़ͤͯεοΩϦͰ͖Δ • ViewModelΛڞ༗͢Δ͜ͱͰɺFragment−ActivityؒΛָʹڞ༗Ͱ͖Δ • ը໘ભҠͰLiveDataΛ࢖͏ͱ͖͸ɺϥούʔΫϥεΛ࡞͓ͬͯ͘ඞཁ ͕͋Γͦ͏ ·ͱΊ

Slide 76

Slide 76 text

• ΋ͬͱৄ͍͠࢓૊ΈΛϒϩάʹ·ͱΊͯ·͢ͷͰɺ͝ ڵຯ͕͋Δํ͸ݟͯΈ͍ͯͩ͘͞ɻ ࠷ޙʹ https://kwmt27.net/2019/09/19/android-lifecycle-codelab/