sealed class Status { object Loading : Status() data class Success(val data: T) : Status() data class Failure(val throwable: Throwable) : Status() } Loading(௨৴த) Failure(ࣦഊ) Success(ޭ) Status
Static ϝιουΓग़͠ data class Item( val id: String, val title: String ) data class MainItem( val id: String, val title: String? ) ྫ͑.. ItemΫϥεͷ title ϓϩύςΟ API ͷ݁ՌΛ֨ೲ͍ͯ͠ Δ߹্ɺۭจࣈྻ ۭനจࣈྻ ؚ͕·Εͯ͠·͏ ϝΠϯը໘ͰͦΕΒແޮͳσʔλ(= null)ͱͯ͠ѻ͍ ͍ͨ ͱ͍͏έʔε title = "" title = " " ม
class MainViewModelTest : Spek({ applyInstantTaskExecutor() applyTestDispatcher() val getItemListUseCase: GetItemListUseCase by memoized { mockk() } val targetViewModel: MainViewModel by memoized { MainViewModel(getItemListUseCase) } // ... ViewModelͷςετ࣌ʹϞοΫͯ͠͠·͏
class SingleLiveEvent : LiveData() { private val pending = AtomicBoolean(false) @MainThread override fun observe(owner: LifecycleOwner, observer: Observer) { if (hasActiveObservers()) { Log.w("SingleLiveEvent", "Multiple observers registered" + " but only one will be notified of changes.") } super.observe(owner, Observer { if (pending.compareAndSet(true, false)) { observer.onChanged(it) } }) } @MainThread public override fun setValue(value: T?) { pending.set(true) super.setValue(value) } } https://github.com/googlesamples/android-architecture/blob/dev-todo-mvvm-live/todoapp/app/ src/main/java/com/example/android/architecture/blueprints/todoapp/SingleLiveEvent.java Λࢀߟʹ͠·ͨ͠