More Related Content
More from Hiroshi Kikuchi (16)
画面状態を抽象化してテスタブル設計ライフを送ろう
- 4. var page = 1
var isLoading = false
var hasBeenReachedPageEnd = false
var isInitialLoading = true
fun showData(data: Data) {
page++
hasBeenReachedPageEnd = checkPageEnd(data)
adapter.setDataAndNotifyChanged(data)
}
if (!isLoading && !hasBeenReachedPageEnd) {
repository
.getData()
.subscribe(object: Observer {
override fun onNext(data: Data) { showData(data) }
override fun onStart() { isLoading = true;
showProggress(isInitialLoading) }
override fun onComplete() { isLoading = false;
hideProgress(isInitialLoading);
isIlitialLoading = false }
})
}
- 14. sealed class State {
// 読み込みしていない
object NeverFetched : State()
// 読み込み中
object Fetching : State()
// 読み込み成功
data class Success(val data: Data) : State()
// 読み込み失敗
data class Failure(val error: Throwable) : State()
}
- 18. class Model(private val repository: Repository) {
// 状態を保持するメンバ代わり。通知役も兼ねる。
private val stateHolder =
BehaviorSubject
.createDefault<State>(State.NeverFetched)
// 外にはObservableとして公開
val stateObservable: Observable<State>
get() = stateHolder
- 19. private fun fetchRepo() {
// 読み込みが始まるときに、読み込み中状態にする。
stateHolder.onNext(State.Fetching)
repository.getData().subscribe({ data ->
// 読み込み成功
stateHolder.onNext(State.Success(data))
}, { error ->
// 読み込み失敗
stateHolder.onNext(State.Failure(error))
})
}
fun fetch() {
// NeverFetched状態でなければ要求を無視する
when (stateHolder.value) {
is State.NeverFetched -> fetchRepo()
else -> return
}
}
}