坚持取向变化的对话视野
在我目前的Android项目中,我有一个对话框,从Web服务中检索对象列表,并在列表中显示这些对象。 它有一个问题,但。 web服务(我的控制范围之外)并不是最快的,所以这个过程需要一段时间,用户通常会在这个过程正在进行时改变设备的方向。 现在的方向更改导致原始webservice调用被取消,并创建一个新的,但这不是我应该如何做我知道。 我希望这个对话框能够在方向改变发生时继续从web服务加载,但是我不知道如何做到这一点。 如何挂钩正在进行的调用并在视图(对话框)中显示此状态? 任何建议表示赞赏。 我玩过Android架构组件和kotlins密封类,将视图状态保存在视图所观察的livedata对象中,但是没有find我喜欢的解决方案。
我相信很多开发者使用RxJava来解决这类问题。 这是我唯一的选择吗?
顺便说一句。 目前我在我的项目中使用MVP架构。
编辑
这是我取消工作的地方 – 如果监听器为空,取消(我正在使用kotlin协程):
override fun getWorklist() { job = onWorkerThread { val result = repository.getResult().awaitResult() onMainThread { when (result) { is Result.Ok -> listener?.onResult(result.getOrDefault(emptyList())) :? job.cancel() // Any HTTP error is Result.Error -> listener?.onHttpError(result.exception) :? job.cancel() // Exception while request invocation is Result.Exception -> listener?.onException(result.exception) :? job.cancel() } } } }
编辑2
我已经试过使用这个Android Arch ViewModel来控制viewstate,但是MediatorLiveData对象不会被viewstate对象的变化触发。 视图保持加载状态:
class MainModel : ViewModel() { private var job: Job? = null val viewState = MutableLiveData().apply { value = Loading("Warsaw") } val dataGetter = MediatorLiveData().apply { addSource(viewState, { Log.d("MainModel", "Viewstate is: " + viewState.value.toString() + ")...") when(it) { is Loading -> { Log.d("MainModel", "Launching coroutine...") job = launch(UI) { Log.d("MainModel", "Loading...") val items = Repository.getWorklist() Log.d("MainModel", "Charts retrieved...") this@MainModel.viewState.postValue(Success(it.items)) Log.d("MainModel", "Posted update to viewstate...") } } } }) } override fun onCleared() { Log.d("MainModel", "Clearing ViewModel") job?.cancel() } } interface ViewState sealed class MainViewState : ViewState class Loading() : MainViewState() class Error(val error: String) : MainViewState() class Success(val items: List) : MainViewState()