ViewModel
j简介: ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续存在。Android 框架可以管理界面控制器(如 Activity 和 Fragment)的生命周期。Android 框架可能会决定销毁或重新创建界面控制器,以响应完全不受您控制的某些用户操作或设备事件。
使用方法-ViewModel
1 还是需要我们引入AndroidX
2 引入ViewModel依赖
def lifecycle_version = "2.2.0"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
具体版本可以自己去官网查看
3 新建自己的ViewModel
public class MyViewModel extends ViewModel {
private int number=0;
public int getNumber() {
return number;
}
}
4 再activity 中新建我们的ViewModel对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);
//通过mode获取数据
int n= model.getNumber();//这里是否感觉像我们自己封装的数据层一样
}
这其实就是我们的ViewModel的基本用法了 其实就是封装的数据层
LiveData
简介 :LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
如果观察者(由 Observer 类表示)的生命周期处于 STARTED 或 RESUMED 状态,则 LiveData 会认为该观察者处于活跃状态。LiveData 只会将更新通知给活跃的观察者。为观察 LiveData 对象而注册的非活跃观察者不会收到更改通知。
使用方法 - LIveData
1 还是依赖的androidX
2 引入LiveData 依赖
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
3 LiveData 配合ViewModel使用 修改上面的ViewModel
public class MyViewModel extends ViewModel {
//将数据包装成我们的LiveData处理的形式
private MutableLiveData<Integer> number;
public MutableLiveData<Integer> getNumber() {
if (number==null){
number= new MutableLiveData<>();
number .setValue(0);
}
return number;
}
}
其实就是数据用MutableLiveData包装下
4 修改activity类里面数据的监听不需要我们自己在数据改变时候去手动刷新Ui
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);
//这里就是我们的LiveData的用处 监听我们数据的改变 来在onChanged方法中修改我们的数据
model.getNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
}
});
}
DataBinding
简介 :数据绑定库是一种支持库,借助该库,您可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。
更加简洁我们activity里面关于View的处理
1 配置DataBinding
在module 的gradle 下配置以下
dataBinding {
enabled = true
}
2 在我们的布局xml中 在根目录下点击问好修改成我们的DataBinding模式的布局
在data标签中添加variable标签 用name标签起一个下面的type类型的变量名
具体使用规则可以去官网查看 下面只是几个基本用法
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="data"
type="com.sut.liuhong.textjetpack.viewLiveData.MyViewModel">
</variable>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".viewLiveData.ViewModelActivity">
<TextView
android:id="@+id/text_01"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="30dp"
android:layout_marginEnd="8dp"
android:text="@{String.valueOf(data.getNumber().getValue())}"
android:textColor="@color/colorAccent"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button_01"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_marginTop="100dp"
android:layout_marginEnd="20dp"
android:text="+1"
android:onClick="@{()->data.addNumber(1)}"
app:layout_constraintEnd_toStartOf="@+id/button_02"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_01" />
<Button
android:id="@+id/button_02"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_marginStart="20dp"
android:layout_marginTop="100dp"
android:text="+2"
android:onClick="@{()->data.addNumber(2)}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/button_01"
app:layout_constraintTop_toBottomOf="@+id/text_01" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
3 修改我们的activity中的用法
//ActivityViewModelBinding 这个类型会根据你的布局文件自动生成 |名字和布局文件名相同
private ActivityViewModelBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding=DataBindingUtil.setContentView(this,R.layout.activity_view_model);
MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class);
binding.setData(model);
binding.setLifecycleOwner(this);
}
这里就基本用法就这样 将tLifecycle ,ViewModel,LiveData,DataBinding 结合使用。
- 注意如果需要在
-
- @Override
public void onSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
} -
- 保存数据ViewModel里面也有提供对应方法 具体研究自己可以去官网查看API