android需要近期研究的项目APP & program

Android-Jetpack-ViewModel的使用

2022-04-20  本文已影响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()
    }
}
上一篇下一篇

猜你喜欢

热点阅读