ViewModel类是用来存储和管理与UI相关的数据,在设计之初就考虑到生命周期的影响。ViewModel允许数据在屏幕旋转等配置变化后存活。

Android framework管理UI控制器(如Activity和Fragment)的生命周期。 framework可能会决定销毁或重新创建UI控制器,以响应完全不受控制的某些用户操作或设备事件。

如果系统销毁或重新创建UI控制器,则存储在其中的所有临时的UI相关数据都将丢失。 举个例子,您的应用中的一个Activity可能包含用户列表。 当因配置更改重新创建Activity时,新Activity必须重新获取用户列表。 对于简单数据,活动可以使用onSaveInstanceState()方法并从onCreate()中的数据包中恢复其数据,但是此方法仅适用于可以序列化然后反序列化的少量数据,而不适用于潜在的大量数据,例如用户列表或位图。

另一个问题是UI控制器经常需要异步请求,需要一些时间才能获取结果。 UI控制器需要管理这些请求,确保在系统销毁自己时,清理这些请求以避免潜在的内存泄漏。 这种管理需要大量的维护代码,并且在因配置更改而重新创建UI控制器的时,可能不得不重新发出已经发出过的请求,这样会浪费许多资源。

UI控制器(如Activity和Fragment)主要用于显示UI数据,对用户操作做出响应,或处理与操作系统之间的通信(如权限请求)。 再让UI控制器负责从数据库或网络加载数据,会导致该类过度臃肿。 给UI控制器分配过多的工作,可能会导致一个类去单独处理应用程序的所有工作,而不是将工作委托给其他类。 给UI控制器分配过多的工作也使得测试工作变得更加困难。

将视图数据的所有权从UI控制器逻辑中分离出来,会让项目更简单,更高效。

为何要使用ViewModel的更多相关文章

  1. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  2. MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

    MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...

  3. 页面与ViewModel(下)

    在上一篇博客中,笔者分享了一些从页面整体的角度对页面与ViewModel的思考.在本文中笔者希望从相对细节的角度分享一些对页面与ViewModel的思考. 比如,当我们在更新View Model中的绑 ...

  4. 页面与ViewModel(上)

    在UWP淘宝与旺信中,笔者主要负责页面与控件的制作,这些工作看似简单,但要想做的全面细致仍然需要深入的思考.本文想分享一些在UWP旺信的制作过程中,笔者在UI页面与控件制作上体会到的一些心得.可能笔者 ...

  5. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查

    前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控件的取值和赋值,远远没有将MVVM的精妙展现出来.最近项目打 ...

  6. 轻量级前端MVVM框架avalon - ViewModel

    废话说了大几篇,我们开始来点干货了~ ViewModel的内部机制 在MVVM中,数据是核心.而jQuery则以DOM为核心. 而DOM只是HTML在JS的世界的抽象,是一个很易变的东西.因此如果业务 ...

  7. MVC5 DBContext.Database.SqlQuery获取对象集合到ViewModel集合中(可以利用这个方法给作为前台视图页cshtml页面的@model 源)

    首先我们已经有了一个Model类: using System;using System.Data.Entity;using System.ComponentModel.DataAnnotations; ...

  8. MVVM中数据验证之 ViewModel vs. Model

                                                      MMVM模式示意图. View绑定到ViewModel,然后执行一些命令在向它请求一个动作.而反过来 ...

  9. WPF MVVM中在ViewModel中关闭或者打开Window

    这篇博客将介绍在MVVM模式ViewModel中关闭和打开View的方法. 1. ViewModel中关闭View public class MainViewModel { public Delega ...

  10. LINQ 联查多表数据并封装到ViewModel的实现

    LINQ 联查多表数据并封装到ViewModel的实现 public List<MyTask> GetPagedTaskList(int pageIndex, int pageSize, ...

随机推荐

  1. ionic1 添加百度地图插件 cordova-plugin-baidumaplocation

    cordova-plugin-baidumaplocation 这个插件返回的数据是 json 格式的  可以直接获取  android 和 ios 都可用 1.先去百度地图平台去创建应用  获取访问 ...

  2. Neo4j图数据库使用

    最近在处理一些图的数据,主要是有向图,如果图的节点不是特别大可以直接加载到内存里来处理,但是当图的节点个数特别大时,内存就放不下了:我 们牵涉到的图的节点数最大可以达到数亿个节点,已经超出的机器内存的 ...

  3. oracle 11g安装过程

    1,工具:Oracle_win64_11gR2_database(64位oracle 11g数据库).iso安装文件,win10系统 2,右键,解压后,点击setup.exe,系统会检测本机的环境,如 ...

  4. 蓝牙协议分析(5)_BLE广播通信相关的技术分析

    1. 前言 大家都知道,相比传统蓝牙,蓝牙低功耗(BLE)最大的突破就是加大了对广播通信(Advertising)的支持和利用.关于广播通信,通过“玩转BLE(1)_Eddystone beacon” ...

  5. React Native Android打包apk

    按照官方的5步曲: 1.在终端里面,cd 到项目的根目录后.执行下面这行命令: keytool -genkey -v -keystore my-release-key.keystore -alias ...

  6. js实现颜色渐变

    #grad { background: -webkit-linear-gradient(red, blue); /* Safari 5.1 - 6.0 */ background: -o-linear ...

  7. 用vs2008打开vs2005项目

    1 使用记事本打开*.sln解决方案文件,将Visual Studio 2005改为Visual Studio 2008 将版本号改为9.00 2 打开扩展名为*.csproj的项目文件,在Defau ...

  8. 【EMV L2】SDA静态数据认证处理流程

    [静态数据认证] 静态数据认证处理过程中,卡片没有执行任何处理,终端执行的处理流程:1.认证中心公钥的获取终端使用卡片上的认证中心公钥索引(PKI)[TAG:8F,Certification Auth ...

  9. Cortex-M3 跳转到指定bin执行

    跳转前指定sp和msp: #if defined(__GNUC__) __attribute__(( naked )) static void set_sp(unsigned long addr) { ...

  10. HTML知识点梳理1

    1,HTML基本结构 <!DOCTYPE html> <html> <head></head> <body> </body> & ...