JectPack架构学习系列二_LiveData

继JectPack架构学习系列一_ViewModel.  所有的用户界面数据放在ViewModel中管理,  还是不够. 每次数据改变的时候都需要驱动视图来驱动刷新控件.  比如用户按钮, 数据递增之后要改变数据 绑定数据.  那么ViewModel中的数据可以用LiveData来表示.  当数据发生改变的时候, 可以加一个观察者, 自动的刷新界面的数据, 从而减少交互,  Controller即是界面就进一步减少了简化

首先, 定义ViewModel:

package com.hzhztech.livedatatest.viewmodel;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class ViewModelWithLiveData extends ViewModel {

    private MutableLiveData<Integer> liveDataNumber;

    public MutableLiveData<Integer> getLiveDataNumber() {
        if(liveDataNumber == null) {
            liveDataNumber = new MutableLiveData<>();
            liveDataNumber.setValue(0);
        }
        return liveDataNumber;
    }

    public void addLiveDataNumber(int n) {
        liveDataNumber.setValue(liveDataNumber.getValue() + n);
    }
}

然后在Controller中使用

package com.hzhztech.livedatatest

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ImageButton
import android.widget.TextView
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.hzhztech.livedatatest.viewmodel.ViewModelWithLiveData
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    lateinit var viewModelWithLiveData: ViewModelWithLiveData

    lateinit var textView:TextView
    lateinit var imageButton:ImageButton
    lateinit var imageButton2:ImageButton

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView = findViewById(R.id.textView)
        imageButton = findViewById(R.id.imageButton)
        imageButton2 = findViewById(R.id.imageButton2)

        viewModelWithLiveData = ViewModelProviders.of(this).get(ViewModelWithLiveData::class.java)
        //LifecyclerOwener  activity就是拥有LifecyclerOwener的对象
        //observe 之后也不需要取消观察, 在activity销毁之后  系统会自动取消销毁
        viewModelWithLiveData.liveDataNumber.observe(this,object :Observer<Int> {
            override fun onChanged(t: Int?) {
                textView.text = t.toString()
            }

        })

        imageButton.setOnClickListener {
            viewModelWithLiveData.addLiveDataNumber(1)
        }
        imageButton2.setOnClickListener {
            viewModelWithLiveData.addLiveDataNumber(-1)
        }

    }
}

observe函数非常关键

在控制器中对MutableLiveData 进行观察, 那么程序的独立性进一步得到了提升

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章