[转]Android ViewModel 的使用

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'
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值