0 原文学习
https://www.jianshu.com/p/721cdcdf11b2
1. ViewModel 好处
目前看到的好处是:横竖屏切换的时候,ViewModel 可以有效保留数据状态。防止数据初始化或丢失
2. 代码示例
2.1 调用示例
package com.fadi.su.viewmodeldemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Chronometer;
public class MainActivity extends AppCompatActivity {
private final static boolean GOOD = true;
private Chronometer chronometer;
private ChronometerViewModel mViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initValues();
if (GOOD) {
newStartTime();
} else {
oldStartTime();
}
}
private void initView() {
chronometer = findViewById(R.id.chronometer);
}
private void initValues() {
}
/**
* 这样的写法,只有横竖屏切换,onCreate 周期就重新调用,导致计数每次都重头开始
*/
private void oldStartTime() {
long startTime = SystemClock.elapsedRealtime();
chronometer.setBase(startTime);
chronometer.start();
}
/**
* 横竖屏切换就很正常了
* ViewModel 可以在横竖屏变化的时候保存数据,即数据保留的生命周期
*
* 例如一个Activity由于旋转而被销毁,但是ViewModel并不会销毁,新创建的Activity的实例仅仅是重新关联到已经存在的ViewModel
*/
private void newStartTime() {
// 一个ViewModel的创建总是和一个作用域(一个 Fragment/Activity)有关,并且只要这个作用域存活,那么这个ViewModel会被一直保留。
mViewModel = ViewModelProviders.of(this).get(ChronometerViewModel.class);
if (mViewModel.getStartTime() == null) {
long startTime = SystemClock.elapsedRealtime();
mViewModel.setStartTime(startTime);
}
chronometer.setBase(mViewModel.getStartTime());
chronometer.start();
}
}
2.2 示例布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Chronometer
android:id="@+id/chronometer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2.3 ViewModel 对象
package com.fadi.su.viewmodeldemo;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModel;
/**
* ViewModel的唯一的作用是管理UI的数据
*/
public class ChronometerViewModel extends ViewModel {
@NonNull
private Long startTime;
@NonNull
public Long getStartTime() {
return startTime;
}
public void setStartTime(@NonNull Long startTime) {
this.startTime = startTime;
}
}
2.4 build.gradle 需要配置
dependencies {
implementation 'android.arch.lifecycle:extensions:1.1.1'
}