JetPack入门(一)

JetPack

Jetpack是一套库、工具和指导,可以帮助开发人员更轻松地编写高质量的应用程序。这些组件帮助您遵循最佳实践,将您从编写样板代码中解放出来,并简化复杂的任务,这样您就可以专注于您关心的代码了

ViewModel&LiveData

ViewModel类被设计成以生命周期的方式存储和管理ui相关的数据。ViewModel类允许数据在配置更改(如屏幕旋转)后仍然存在。

LiveData是一个可观察的数据持有者类。与常规的可观察对象不同,LiveData是生命周期感知的,这意味着它尊重其他应用程序组件的生命周期,比如活动、片段或服务。这种意识确保LiveData只更新处于活动生命周期状态的应用程序组件观察者。

public class MyViewModelWithLiveData extends ViewModel {
  // 数据
    private MutableLiveData<Integer> likeNumber;
    public MutableLiveData<Integer> getLikeNumber() {
        if (likeNumber == null){
            likeNumber = new MutableLiveData<>();
            likeNumber.setValue(0);
        }
        return likeNumber;
    }
    public void addLikeNumber(int add){
        likeNumber.setValue(likeNumber.getValue()+add);
    }
}

监听数据改变

        mModelWithLiveData = new ViewModelProvider(this).get(MyViewModelWithLiveData.class);
        mModelWithLiveData.getLikeNumber().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                //改变界面数据
                mTextView.setText(String.valueOf(integer));
            }
        });

DataBinding

数据绑定库是一个支持库,允许您使用声明格式(而不是编程方式)将布局中的UI组件绑定到应用程序中的数据源。

在当前模块下的gradle文件下添加如下配置

android {
    ...
    dataBinding {
        enabled = true
    }
}

用layout包装原布局代码

variable字段中name可以理解为ViewModel的实例对象,type指定ViewModel类

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="data"
            type="com.example.collectiondemoandroid.MyViewModelWithLiveData"/>
 
    </data>
   <LinearLayout
        ......
   </LinearLayout>
</layout>
  • 绑定值
  <TextView
       android:id="@+id/textView"
       android:text="@{String.valueOf(data.likeNumber)}"
 />
  • 绑定方法
        <ImageButton
            android:id="@+id/upButton"
            android:onClick="@{()->data.addLikeNumber(2)}"
            />

绑定视图

'ActivityMainBinding' 命名方式为layout的名称加Binding

 ActivityMainBinding dataBinding;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        dataBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
//  获取控件      dataBinding.upButton

        //获取viewmodel对象
        mModelWithLiveData = new ViewModelProvider(this).get(MyViewModelWithLiveData.class);        
        //设置数据
        dataBinding.setData(mModelWithLiveData);
        //设置监听
        dataBinding.setLifecycleOwner(this);
 
   }

Saved State module for ViewModel

当应用被系统Kill下次直接恢复上次的数据
使用也很简单,其实只需要将上面的MyViewModelWithLiveData进行如下的修改就行

  1. SavedStateHandle对象管理数据
  2. 添加构造函数传入 SavedStateHandle对象

SavedStateHandle方法如下

  • get(String key)
  • contains(String key)
  • remove(String key)
  • set(String key, T value)
  • keys()
  • getLiveData()
public class MyViewModelWithLiveData extends ViewModel {

    final  public static String LIKEKEY = "likenumber";
    private SavedStateHandle mSavedStateHandle;
    //构造函数
    public  MyViewModelWithLiveData(SavedStateHandle savedStateHandle){
       mSavedStateHandle = savedStateHandle;
    }
    public MutableLiveData<Integer> getLikeNumber() {
        if (!mSavedStateHandle.contains(LIKEKEY)){
            mSavedStateHandle.set(LIKEKEY,0);
        }
        //以LiveData的形式去除
     return mSavedStateHandle.getLiveData(LIKEKEY);

    }
    public void addLikeNumber(int add){
        getLikeNumber().setValue(getLikeNumber().getValue()+add);
    }
}
原文地址:https://www.cnblogs.com/cnman/p/12944505.html