可以使用框架,参考内容如下:
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应用程序、编译 *** 作系统很牛吗、详细说明基于文档/视图结构应用程序的构建,写出其各派生类的调用关系,并写出其主要关键的代码.越详越好等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)