ViewModel是一个负责准备和管理Activity或Fragment数据的类。它还处理Activity / Fragment与应用程序其余部分的通信(例如,调用业务逻辑类)。

始终与范围(Fragment或Activity)关联创建ViewModel,并且只要范围处于活动状态,将保留ViewModel。例如。如果它是一个Activity,直到它完成。

换句话说,这意味着如果ViewModel的所有者因配置更改(例如旋转)而被销毁,则不会销毁它。所有者的新实例将重新连接到现有的ViewModel。

ViewModel的目的是获取并保留Activity或Fragment所需的信息。 Activity或Fragment应该能够观察ViewModel中的更改。 ViewModels通常通过LiveData或Android数据绑定公开此信息。您还可以使用您最喜欢的框架中的任何可观察性构造。

ViewModel唯一的职责是管理UI的数据。它永远不应访问您的视图层次结构或将引用保存回活动或片段。

从“活动”角度来看,典型用法是:

public class UserActivity extends Activity {

     @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user_activity_layout);
final UserModel viewModel = ViewModelProviders.of(this).get(UserModel.class);
viewModel.userLiveData.observer(this, new Observer() {
@Override
public void onChanged(@Nullable User data) {
// update ui.
}
});
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.doAction();
}
});
}
}

ViewModel would be:

 public class UserModel extends ViewModel {
public final LiveData<User> userLiveData = new LiveData<>(); public UserModel() {
// trigger user load.
} void doAction() {
// depending on the action, do necessary business logic calls and update the
// userLiveData.
}
}

ViewModels还可以用作活动的不同片段之间的通信层。 每个Fragment都可以通过其Activity使用相同的密钥获取ViewModel。 这允许以解耦方式在片段之间进行通信,使得它们永远不需要直接与其他片段对话。

 public class MyFragment extends Fragment {
public void onStart() {
UserModel userModel = ViewModelProviders.of(getActivity()).get(UserModel.class);
}
}

ViewModel学习的更多相关文章

  1. [ExtJS5学习笔记]第十节 Extjs5新增特性之ViewModel和DataBinding

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/38612721 本文作者:sushengmiyan ------------------ ...

  2. Jetpack架构组件学习(2)——ViewModel和Livedata使用

    要看本系列其他文章,可访问此链接Jetpack架构学习 | Stars-One的杂货小窝 原文地址:Jetpack架构组件学习(2)--ViewModel和Livedata使用 | Stars-One ...

  3. 【WPF学习日记】——Window的DataContext绑定ViewModel

    1.全局的ViewModel绑定: a)设定全局的ViewModel(App.xaml中): 1 <Application x:Class="MyTest.App" 2 xm ...

  4. [ExtJS5学习笔记]第十六节 Extjs5使用panel新增的ViewModel属性绑定数据

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/39078627 sencha官方API:http://docs.sencha.com/e ...

  5. ViewModel处理View相关事件的多种方式(非技术贴,仅学习总结)

    众所周知,在UWP中,微软为我们提供了一种新的绑定方式:x:bind,它是基于编译时的绑定.在性能方面,运行时绑定Binding与它相比还是有些逊色的.因此针对一些确定的.不需要变更的数据,我们完全有 ...

  6. 迷你MVVM框架 avalonjs 学习教程2、模块化、ViewModel、作用域

    一个项目是由许多人分工写的,因此必须要合理地拆散,于是有了模块化.体现在工作上,PM通常它这为某某版块,某某频道,某某页面.某一个模块,必须是包含其固有的数据,样式,HTML与处理逻辑.在jQuery ...

  7. 【extjs6学习笔记】1.14 初始: ViewModel

    ViewModel是一个管理特定UI组件数据的类. 可以将其视为特定视图的记录容器. 它支持与UI组件的双向数据绑定,只要用户在视图中更改数据,它具有最新的副本. 与模型不同,它不能包含代理,因此它不 ...

  8. ASP.NET MVC 学习笔记之 MVC + EF中的EO DTO ViewModel

    EO: Entity Object 就是EF中的实体类, 对EO的操作会对数据库产生影响. DTO: Data Transfer Object 数据传输对象.用于在各层之间传递数据的普通类,DTO有哪 ...

  9. WPF学习笔记:MVVM模式下,ViewModel如何关闭View?

    原文:http://blog.csdn.net/leftfist/article/details/32349731 矫枉过正,从一个极端走向另一个极端.MVVM模式,View只负责呈现,虽然也有后台代 ...

随机推荐

  1. [SCOI2005]繁忙的都市

    emm...就是个最小生成树板子...我还能说啥... 为啥我早出生个十多年.../(ㄒoㄒ)/~~ 五六年也好啊.../(ㄒoㄒ)/~~ 呆码: #include<iostream> # ...

  2. nginx——优化 Nginx 站点目录

    1. 禁止解析指定目录下的指定程序 location ~ ^/data/.*.(php|php5|sh|pl|py)$ { # 根据实际来禁止哪些目录下的程序,且该配置必须写在 Nginx 解析 PH ...

  3. Fescar Example-Spring Cloud

    项目说明 本项目演示如何使用 Fescar Starter 完成 Spring Cloud 应用的分布式事务接入. 准备工作 在运行此示例之前,你需要先完成如下几步准备工作: 配置数据库 创建 UND ...

  4. java和js中JSONObject,JSONArray,Map,String之间转换

    --------------------------------------------------Java中--------------------------------------------- ...

  5. 1.5 pycharm使用

    1.5 pycharm使用 前言    在写脚本之前,先要找个顺手的写脚本工具.python是一门解释性编程语言,所以一般把写python的工具叫解释器.写python脚本的工具很多,小编这里就不一一 ...

  6. easyui datagrid去掉全选按钮

    第一步: F12查看元素,选中全选按钮,把全选按钮的class里边加上display:none属性.找到对应的class,即.datagrid-header-check. 第二步: 在加载 表格的时候 ...

  7. latex之矩阵表示

    $ \begin{matrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{matrix}\quad \begin{ ...

  8. Linq中的左连,右连,内连

    1.左连接: var LeftJoin = from emp in ListOfEmployeesjoin dept in ListOfDepartmenton emp.DeptID equals d ...

  9. 全志A33 lichee 开发板 Linux中断编程原理说明

    开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 本节实验目标实现按键触发中断 ...

  10. PythonStudy——Python字典底层实现原理 The underlying implementation principle of Python dictionary

    在Python中,字典是通过散列表或说哈希表实现的.字典也被称为关联数组,还称为哈希数组等.也就是说,字典也是一个数组,但数组的索引是键经过哈希函数处理后得到的散列值.哈希函数的目的是使键均匀地分布在 ...