Android-Jetpack-ViewModel的使用

作者: 阿博聊编程 | 来源:发表于2022-04-20 15:23 被阅读0次
    配图来自网络,如侵必删

    我们在开发当中,可能会想着有没有办法进行数据和界面的解耦,这篇文章分享一下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重建,不会调用ViewModelonCleared()方法。

    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()
        }
    }
    

    相关文章

      网友评论

        本文标题:Android-Jetpack-ViewModel的使用

        本文链接:https://www.haomeiwen.com/subject/zisvertx.html