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的使用

    我们在开发当中,可能会想着有没有办法进行数据和界面的解耦,这篇文章分享一下ViewModel的使用实现数据与界面之...

  • iconfont的使用(下载使用)

    1、下载文件 2、在生命周期中引入项目 beforeCreate () { var domModule = ...

  • Gson的使用--使用注解

    Gson为了简化序列化和反序列化的过程,提供了很多注解,这些注解大致分为三类,我们一一的介绍一下。 自定义字段的名...

  • 记录使用iframe的使用

    默认记录一下----可以说 这是我第一次使用iframe 之前都没有使用过; 使用方式: 自己开发就用了这几个属...

  • with的使用

    下面例子可以具体说明with如何工作: 运行代码,输出如下

  • this的使用

    什么是this? this是一个关键字,这个关键字总是返回一个对象;简单说,就是返回属性或方法“当前”所在的对象。...

  • this的使用

    JS中this调用有几种情况 一:纯粹的函数调用 这是函数的最通常用法,属于全局性调用,因此this就代表全局对象...

  • ==的使用

    积累日常遇到的编码规范,良好的编码习惯,持续更新。。。 日常使用==用于判断的时候,习惯性将比较值写前面,变量写后...

  • this的使用

    1.默认绑定,就是函数立即执行。 函数立即执行就是指向window,但是如果是node环境,就是指向全局conso...

  • %in% 的使用

    写在前面:From 生信技能书向量难点之一:%in% 难点 (1)== 与 %in% 的区别== 强调位置,x和对...

网友评论

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

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