如何构建Android MVVM应用程序

如何构建Android MVVM应用程序,第1张

可以使用框架,参考内容如下:

1、概述

Databinding 是一种框架,MVVM是一种模式,两者的概念是不一样的。我的理解DataBinding是一个实现数据和UI绑定的框架,只是一个实现MVVM模式的工具。ViewModel和View可以通过DataBinding来实现单向绑定和双向绑定,这套UI和数据之间的动态监听和动态更新的框架Google已经帮我们做好了。在MVVM模式中ViewModel和View是用绑定关系来实现的,所以有了DataBinding 使我们构建Android MVVM 应用程序成为可能。

之前看了很多关于DataBinding的博客和相关的一些Demo,大多数就是往xml布局文件传入一些数据,然后把这些数据绑定到控件上( 如TextView binding:text=“@{username} ),接着在这些控件上(如Button binding:setOnClickListener=”@{userlistener}”) 设置一些事件到控件上,基本讲述都是DataBinding的基本用法。但是并没有人告诉你把一个onClickListener 写到一个类并把这个listener绑定到xml里面上是不是不太好,也没有人告诉你这个和xml布局绑定的ViewModel类应该放哪些数据,应该做什么事?应该如何设计?更是很少有博文来告诉你在Android 中如何通过Data Binding 去构建MVVM 的应用框架。这也就是是本篇文章的重点。接下来,我们先来看看什么是MVVM,然后在一步一步来设计整个应用程序框架。

源码地址 >

一程序启动机制:

1从CFrameWnd类派生自己的框架窗口类 CMyFrameWnd

11 从CWinApp类派生自己的应用程序类CMyWinApp

重写 CWinApp成员虚函数InitInstance,在这个函数中

注册窗口类/创建窗口/显示窗口/刷新窗口

2 程序的执行流程

21 构造 theApp对象 执行 CWinApp类的构造函数

将theApp对象地址保存到 当前程序模块状态信息中

将theApp对象地址保存到 当前程序线程状态信息中

AfxGetThread/AfxGetApp - 返回theApp对象地址

22 进入入口函数WinMain,调用AfxWinMain

3AfxWinMain函数的内部执行流程

31 获取 应用程序类的全局对象 theApp的地址。

32 调用 应用程序类的成员虚函数InitApplication初始化应用

程序。

33 调用 应用程序类的成员虚函数InitInstance 注册窗口类,

创建并显示窗口

34 调用 应用程序类的成员虚函数Run实现消息循环

1)如果没消息调用应用程序类的成员虚函数OnIdle空闲

处理

2)调用 应用程序类的成员虚函数PumpMessage实现提取/

翻译/派发 消息

3)调用 应用程序类的成员虚函数ExitInstance实现善后处

二 窗口创建机制(2)

1 加载菜单

2 调用CreateEx函数

21 调用PreCreateWindow 设计并注册窗口类

211 调用AfxDeferRegisterClass设计窗口类

WNDCLASS wndcls;

wndclslpfnWndProc = DefWindowProc;//

调用 _AfxRegisterWithIcon,在函数内部调用

AfxRegisterClass,在函数内部调用WIN32 API函数

::RegisterClass 将窗口类成功注册到 *** 作系统中

22 调用AfxHookWindowCreate函数

221 利用SetWindowsHookEx 函数在程序中埋下一个类型为

WH_CBT的钩子

222 将 自己new的框架类对象地址(pFrame)保存到当前程序

线程信息中

23 调用windows API函数::CreateWindowEx创建窗口,马上执行

钩子处理函数

3 钩子处理函数

31 将窗口句柄 和 框架类对象 建立 一对一的绑定关系

32 将窗口处理函数 更改为 AfxWndProc(真正的处理函数)

三 消息映射机制的执行过程

1 利用当前窗口对象(pFrame)调用GetMessageMap获取本类静态变量

messageMap的地址pMessageMap。

2 利用pMessageMap第二个成员获取相应静态数组首地址,在静态

数组中查找消息ID对应处理函数地址,如果找到了执行4

3 如果没找到,获取父类静态变量地址并给pMessageMap赋值,如

果为NULL,停止循环,如果不为NULL,执行2

4 调用获取到的静态数组元素中最后一个成员(成员函数地址)

完成消息的处理。

四运行时类信息

1运行是类信息的作用

在程序运行过程中,可以获取对象的类信息,以及继承派生关系

2运行时类信息的使用

21自己的类必须从CObject派生

22类内添加声明宏 DECLARE_DYNAMIC

23类外添加实现宏 IMPLEMENT_DYNAMIC

3如何判断

利用CObject::IsKindOf判断对象是否属于该类

4数据结构

struct CRuntimeClass

{

LPCSTR m_lpszClassName;//类名称

int m_nObjectSize;//类的大小(sizeof)

UINT m_wSchema; //类的版本(0XFFFF)

CObject (PASCAL m_pfnCreateObject)();//用于动态创建机制,运行时类信息机制为NULL

CRuntimeClass m_pBaseClass;//

CRuntimeClass m_pNextClass; //为NULL

};

5RUNTIME_CLASS(theClass)

(CRuntimeClass)(&CAnimal::classCAnimal)//返回成员变量theClass的地址

有点乱,这确实不是三言两语就能解释清楚的,我看带着你走一下源程序还能勉强给你讲清楚,这样看,你绝对看不懂的啊。我也无能为力哦

编译:把当前源代码编译成2进制目标文件

构建:先把工程中所有源代码编译成目标文件,再link链接成可执行文件(或者lib、dll,看具体工程)。这其中,如果有源文件在此之前被单独编译过,这个文件就不参加编译,它之前编译时产生的目标文件参加link(链接)过程。

重新构建:就是不管之前有没有源文件被单独编译,都要参与编译。

不同的C++编译环境可能不一定叫构建,但都有类似的功能。

以上就是关于如何构建Android MVVM应用程序全部的内容,包括:如何构建Android MVVM应用程序、编译 *** 作系统很牛吗、详细说明基于文档/视图结构应用程序的构建,写出其各派生类的调用关系,并写出其主要关键的代码.越详越好等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9655621.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存