在Android MVVM架构中,LiveData做为通知UI更新的桥梁,地位极其重要,能够说是MVVM的核心组件。git
在具体实践中,它每每连接着对数据的异步操做结果。好比在登陆操做中,须要执行异步登陆逻辑,逻辑完成的结果会获得用户信息数据,这个数据可能会赋值给LiveData,用代码表示以下:github
class UserVM : ViewModel() {
val userData = MutableLiveData<User>()
fun login(){
viewModelScope.launch {
val result = "http://www.lixiaojun.xin/api/login".http().post<User>().await()
userData.postValue(result)
}
}
}
复制代码
这样的代码会大量出如今咱们的VM层中。api
然而异步操做不是当即的,并且有进度,有状态的。咱们的UI极可能须要知道当前的异步数据操做是否正在进行(能够显示进度条),是否已经完成,或者是否失败。架构
通常咱们能够能这样作:异步
userVM.userData.observe(this, Observer{
if(it==null){
showFail() //显示请求失败
}else{
updateUI() //更新UI
}
})
showProgress() //登陆以前显示进度条
userVM.login()
复制代码
虽然咱们也能在代码的某些地方去插入状态展现,但这样的写法太过零碎,不易维护和管理。假设UI代码有几百行,你就会很难找到某个请求的进度条在哪里写着。post
若是每一个LiveData能携带本身的状态,咱们就能够面向LiveData来进行状态更新,并且能在一个地方集中管理状态,这样就优雅的很。this
因而咱们能够对LiveData进行扩展,增长一个state
字段,表明当前异步操做的状态。因为状态应当是可监听的,因此state
也是一个LiveData。代码以下:spa
/** * Description: 携带状态的LiveData * Create by lxj, at 2019/3/6 */
class StateLiveData<T> : MutableLiveData<T>() {
enum class State {
Idle, Loading, Success,Error
}
val state = MutableLiveData<State>()
init {
clearState()
}
fun postValueAndSuccess(value: T) {
super.postValue(value)
postSuccess()
}
fun clearState() {
state.postValue(State.Idle)
}
fun postLoading() {
state.postValue(State.Loading)
}
fun postSuccess() {
state.postValue(State.Success)
}
fun postError() {
state.postValue(State.Error)
}
fun changeState(s: State) {
state.postValue(s)
}
}
复制代码
咱们使用StateLiveData改写VM层的代码:code
class UserVM : ViewModel() {
val userData = StateLiveData<User>()
fun login(){
viewModelScope.launch {
userData.postLoading()
val result = "http://www.lixiaojun.xin/api/login".http().post<User>().await()
if(result==null){
userData.postError()
}else{
userData.postValueAndSuccess(result)
}
}
}
}
复制代码
而此时UI层对状态的监听变成了这样:cdn
//统一管理LiveData的状态
userVM.userData.state.observe(this, Observer{
when(it){
StateLiveData.State.Loading -> showProgress()
StateLiveData.State.Error -> showFail()
//...其余状态处理
}
})
userVM.userData.observe(this, Observer{
updateUI() //直接更新UI
})
userVM.login()
复制代码
上面的StateLiveData被内置在个人AndroidKTX类库中:github.com/li-xiaojun/… ,若是你用Kotlin开发Android,这个库将可以大大提升你的开发速度。我是俊哥,致力于推动现代化的Android开发,用最佳的实践,最优雅的代码教你最快速的开发高质量Android应用。