1.开发环境Android studio 3.4.0,kotlin
2.databinding用法
3.jetpack lifecycles的LiveData 和 ViewModel用法
测试效果如下:可以看到在onResume执行之前不会更新视图,在onStop之后也不会更新视图
①添加依赖
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.0"
②创建一个DevInfoVM继承ViewModel
import android.os.Handler
import android.os.Looper
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.zjhj.maxapp.bean.DevInfo
import com.zjhj.maxapp.http.Urls
import com.zjhj.maxapp.http.base.BaseRequest
import com.zjhj.maxapp.http.base.IBaseCallView
import com.zjhj.maxapp.utils.L
import java.util.*
import java.util.TimerTask
/**
* ViewModel层绑定绑定view
*
*/
class DevInfoVM : ViewModel(), IBaseCallView {
val handler = Handler(Looper.getMainLooper())
val req: BaseRequest = BaseRequest(this)
val liveData = MutableLiveData<DevInfo>()
fun getDev(): LiveData<DevInfo> {
loadDevInfo()
return liveData
}
fun getData(res : String){
L.d("$res 加载数据,返回null")
liveData.postValue(null)
}
fun getMoreData() {
L.d("加载更多,返回数据...")
liveData.postValue(null)
}
private fun loadDevInfo() {//请求设备数据
L.d("请求数据开始..")
req.getData(url = Urls.getDevEvInfo, reqType = 111)
}
override fun loadStart(msg: String, reqType: Int) {
}
override fun loadSuccessData(content: String?, isLoadMore: Boolean, reqType: Int) {
val info: MutableList<DevInfo>? = req.getResultList(content, DevInfo::class.java)
if (info != null)
liveData.postValue(info.get(0))
Timer().schedule(object : TimerTask(){
override fun run() {
L.d("执行延时操作 10秒")
liveData.postValue(null)
}
},10000)
}
override fun loadErr(message: String, reqType: Int) {
}
}
③在Activity中绑定代码块
...
lateinit var model: DevInfoVM
override fun setContentView() {
//获取ViewModel
model = ViewModelProviders.of(this).get(DevInfoVM::class.java)
//绑定生命周期
model.getDev().observe(this, Observer<DevInfo> { devInfo ->
// update UI1
L.d("更新视图:" + devInfo?.values?.mainCompany)
toolBar.title = devInfo?.values?.mainCompany
})
setContentView(R.layout.activity_main)
setSupportActionBar(toolBar)
model.getData("setContentView");
}
override fun onStart() {
super.onStart()
L.d("onStart")
model.getData("onStart")
}
override fun onRestart() {
super.onRestart()
L.d("onRestart")
}
override fun onResume() {
super.onResume()
L.d("onResume")
model.getData("onResume")
}
override fun onStop() {
super.onStop()
L.d("onStop")
model.getData("onResume")
}
...
- 比较databingding与jetpack的lifecycle