(三)Android Jetpack 组件之ViewModel

1、概述

ViewModel是一个类,负责准备和管理Activity或Fragment的数据。它还处理活动/片段与应用程序其余部分的通信(例如,调用业务逻辑类)。
ViewModel的目的是获取并保留Activity或Fragment所需的信息。活动或片段应能够观察ViewModel中的更改。ViewModel通常通过LiveData或Android数据绑定公开此信息。
ViewModel的唯一责任是管理UI的数据。它永远不应该访问您的视图层次结构,也不应该保留对活动或片段的引用。

2、ViewModel的生命周期

在这里插入图片描述
可以看到,ViewModel 生命只有两部分组成:Scope,onCleared()。
当在Scope范围时,会一直在贯穿在Activity的非OnDestory()之前的生命周期内,当执行OnDestory()时会先调用onCleared() 方法。
在这里插入图片描述

3、如何使用ViewModel

使用采用最新的API:
在App的build.gradle文件导入:

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

先创建一个对象类NewUser.class

import androidx.databinding.ObservableField;

/**
 * Created by Administrator
 * on 2020/3/27
 */
public class NewUser {
    public final ObservableField<String> name = new ObservableField<>();

    public NewUser(String name) {
        this.name.set(name);
    }
}

再创建一个ViewModel开头的类,继承ViewModel

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

import com.hb.mvvm.viewmodel.entity.NewUser;

/**
 * Created by Administrator
 * on 2020/3/27
 */
public class UserViewModel extends ViewModel {
    public MutableLiveData<NewUser> getUserLiveData() {
        return userLiveData;
    }
	
    MutableLiveData<NewUser> userLiveData = new MutableLiveData<>();

    public UserViewModel() {
        // trigger user load.
        Log.d(UserViewModel.class.getSimpleName(), "===========UserViewModel()");
    }

    @Override
    protected void onCleared() {
        super.onCleared();
        Log.d(UserViewModel.class.getSimpleName(), "===========onCleared()");
    }
}

注意:类中用到了MutableLiveData,这个是LiveData的一个派生类。LiveData与ViewModel是经常搭配在一起使用的。下一章会介绍LiveData的知识点。
现在我们只需要知道:可以利用MutableLiveData观测整个实体类或者数据类型发送变化时进行通知。

使用ViewModel类

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

import com.hb.mvvm.R;
import com.hb.mvvm.databinding.ActivityViewModelBinding;
import com.hb.mvvm.viewmodel.entity.NewUser;

public class ViewModelActivity extends AppCompatActivity {

    ActivityViewModelBinding dataBinding;
    NewUser myNewUser;
    UserViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(ViewModelActivity.class.getSimpleName(), "========onCreate()");
        myNewUser = new NewUser("小明");

        dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_view_model);
        viewModel = new ViewModelProvider(this).get(UserViewModel.class);
        viewModel.getUserLiveData().observe(this, new Observer<NewUser>() {
            @Override
            public void onChanged(NewUser newUser) {
                dataBinding.setName(newUser.name.get());
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(ViewModelActivity.class.getSimpleName(), "========onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(ViewModelActivity.class.getSimpleName(), "========onPause()");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(ViewModelActivity.class.getSimpleName(), "========onStart()");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(ViewModelActivity.class.getSimpleName(), "========onRestart()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(ViewModelActivity.class.getSimpleName(), "========onStop()");
        myNewUser.name.set("李四");
        viewModel.getUserLiveData().setValue(myNewUser);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(ViewModelActivity.class.getSimpleName(), "========onDestroy()");
    }
}

输出结果:
在这里插入图片描述
从结果可以看出viewModel的生命周期与本文第二节中的图是吻合的。

4、总结

因本文属于一些列文章,暂时先不去关心ViewModel具体怎么应用到项目中,我们先关注怎么使用它,知道它能帮助我们恢复数据,可以更好的在Activity和Fragment中使用生命周期进行数据的管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值