我们在开发当中,可能会想着有没有办法进行数据和界面的解耦,这篇文章分享一下ViewModel
的使用实现数据与界面之间的解耦,希望对看文章的小伙伴有所启发。
导入ViewModel的依赖
兼容Java和kotlin的依赖:
implementation('androidx.lifecycle:lifecycle-viewmodel:2.4.1')
仅生成kotlin的依赖:
implementation('androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1')
compose的依赖:
implementation('androidx.lifecycle:lifecycle-viewmodel-compose:2.4.1')
代码示例
1.创建一个继承ViewModel
的类,我这里的命名是MyViewModel
import androidx.lifecycle.ViewModel
import java.util.*
class MyViewModel : ViewModel() {
private var timer: Timer? = null
var currentTime: Int = 0
var onTimerChangeListener: OnTimeChangeListener? = null
fun setOnTimeChangeListener(on:OnTimeChangeListener){
onTimerChangeListener = on
}
/**
* 开始倒计时
*/
fun startTimer() {
if (timer == null) {
timer = Timer()
val timerTask = object : TimerTask() {
override fun run() {
currentTime++
onTimerChangeListener?.onTimeChanged(currentTime)
}
}
timer?.schedule(timerTask, 1000, 1000)
}
}
interface OnTimeChangeListener {
fun onTimeChanged(s: Int)
}
override fun onCleared() {
super.onCleared()
timer?.cancel()
}
我们点击进入ViewModel
类里面,我们会发现ViewModel
是一个抽象类,里面只有一个onCleared()
方法,我们可以在这里面做释放资源的操作。需要注意的是:
由于屏幕旋转导致
Activity
重建,不会调用ViewModel
的onCleared()
方法。
2.在Activity
中使用
import android.annotation.SuppressLint
import android.os.Bundle
import android.widget.TextView
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity(R.layout.activity_main) {
private val mMyViewModel:MyViewModel by viewModels()
@SuppressLint("UseCompatLoadingForDrawables")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mMyViewModel.setOnTimeChangeListener(object :MyViewModel.OnTimeChangeListener{
override fun onTimeChanged(s: Int) {
runOnUiThread {
findViewById<TextView>(R.id.currentTv).text = "当前时间:${s}"
}
}
})
mMyViewModel.startTimer()
}
}
网友评论