LiveData与ViewModel


单独使用LiveData

  1. 创建LiveData实例。持有特定的数据类型,例如 int ,String。
  2. 创建一个Observer对象,并且实现onChanged()方法。在onChanged()方法类可以进行UI的刷新等。
  3. 使用LiveData实例的observe(…,…)方法,将Observer对象添加到LiveData中。方法原型为 observe(LifecycleOwner owner,Observer observer),第一个参数是LifecycleOwner对象,为LiveData能够监听生命周期的能力来源。第二个参数为我们的监听对象。

添加LiveData和ViewModel的依赖 ↓

// 添加LiveData和ViewModel的依赖implementation 'android.arch.lifecycle:extensions:1.1.1'

界面准备按钮用来开启,使得UI刷新 ↓

MainActivity中的代码 ↓

class MainActivity : AppCompatActivity() {
    val TAG = "MainActivity"
    val btnStart = btn_start
    val mTvNumber = tv_number
    var mNumberLiveData: MutableLiveData<Int>? = null // 声明变量
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mNumberLiveData = MutableLiveData()
        btnStart.setOnClickListener { view: View? ->
            thread {
                var number = 0
                while (number < 5) {
                    mNumberLiveData?.postValue(number)
                    Log.d(TAG, "setOnClickListener" + number)
                    Thread.sleep(3000)
                    number++
                }

            }
        }
        mNumberLiveData?.observe(this, object : Observer<Int> {
            override fun onChanged(t: Int?) {
                mTvNumber.setText("" + t)
                Log.d(TAG, "onChanged" + t)
            }

        })
    }
}

界面的TextView会根据数据进行刷新。

单独使用ViewModel

  1. 创建ViewModel的继承类
  2. 在控制器中实例化继承类

创建ViewModel继承类 ↓

class MyViewModel() : ViewModel() {
    var number = 0
}

修改控制器 ↓

class MainActivity : AppCompatActivity() {
    val TAG = "MainActivity"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // ViewModelProvider.of() 获得MyViewModel持久类用来保存UI数据
        // "MyViewModel::class.java" 反射引用类型
        var myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
        tv_number.setText(myViewModel.number.toString())
        btn_start.setOnClickListener {
            myViewModel.number++
            tv_number.setText(myViewModel.number.toString())
        }
    }
}

简单的界面样式 ↓

LiveData和ViewModel配合使用

  1. 需要有ViewModel的继承类
  2. 需要在ViewModel的继承类中实例化LiveData类型
  3. 需要在控制器中初始化ViewModel的继承类
  4. 需要调用LiveData的observe的方法
class MyViewModel : ViewModel() {
    var mutableLiveData = MutableLiveData<Int>()
    init {
        mutableLiveData.value=0
    }
    fun getLive(): MutableLiveData<Int> {
        return mutableLiveData
    }

    fun addNumber(number: Int) {
        mutableLiveData?.value=number+ mutableLiveData.value!!
    }
}
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 获得MyViewModel实例
        var myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
        btn_addone.setOnClickListener {
            myViewModel?.addNumber(1)
        }
        myViewModel?.getLive()?.observe(this, object : Observer<Int> {
            override fun onChanged(t: Int?) {
                tv_number.setText(t.toString())
            }

        })
    }
}

什么是LiveData

LiveData是一个可以观察的数据持有类,但是不同于通常的观察者,它具有声明周期的感知能力。通俗些讲,它所持有的数据发生改变时,并且Lifecycle对象还处于活跃状态,LiveData将立即通知观察者数据发生了变化。相比于不同的观察者它多了生命周期和感知能力。

什么是ViewModel

简单说ViewModel是一种用来存储和管理UI相关数据的类。但是与其他的Model不同的是,他支持在系统改变时保存数据。

当屏幕发生改变时,会导致Activity/Fragment重新绘制,会导致我们之前的数据丢失。比如,在EditText中输入了内容,但是当屏幕扭转时,会发现editText中的文本被清空了。

当对于一下简单的数据,我们可以通过Activity的onSaveInstanceState()方法中储存,然后通过onCreate()中进行恢复,但是这种方式只适合存储少量的数据,并且是能被序列化和反序列的数据。而对那些大量的数据则不适用。

此外,它也使View的数据持有者和Viewcontroller逻辑更加分离,便于解耦和测试。

引用:https://juejin.im/post/5ca9f9156fb9a05e3d0a8aea#heading-6


文章作者: TheCara
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 TheCara !
 上一篇
DataBinding的使用 DataBinding的使用
DataBinding 配合 LiveData 和 ViewModel 使用 需要创建MyViewModel类,继承ViewModel 需要添加DataBinding的gradle(app)配置信息 添加配置信息 在gradle(app)
2020-07-24
下一篇 
git 讲解 git 讲解
修改提交文件大小在要提交的项目根目录下使用。 $ git config --local http.postBuffer 524288000设置为500MB。 查看本地分支git branch 查看远程仓库所有分支git branch -r
2020-07-19
  目录