Android 程序框架设计
http://blog.csdn.net/leehong2005/article/details/8535306
这篇文章主要内容来自于之前我讲的一个PPT文档,现在将其整理如下。欢迎指正。以下的内容都是来自于我自身的经验,欢迎大家多提自己的建议。
1、一些概念
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。
设计模式是在某种特别的情况下,针对某种问题的某种典型、通用的解决方法。
当然,这里是需要具体问题具体分析的,我主要的意思就是说,要适当利用模式,我们不能为了用模式而去用模式,我们是要用模式来解决我们实际的问题。
关于概念完整性,在《人月神话》一书在有大量的阐述,这里,我把我的理解写出来,与大家分享。
1)概念完整性是系统设计中最重要的考虑因素。当你的系统规模越大,这一点体现得越明显。
3)要获得概念上的完整性,就必须有人控制这些概念,类似于贵族的专制统治。这里,对于团队中的项目经理或架构师必须对项目有绝对的权威,不然,这个项目里面的就无法统一号令。
2、设计之前应该做什么
下面代码示例了Adapter#getView()方法的实现,它返回BookView,BookView提供方法来接收数据,至于BookView的显示,则根据设置的数据来显示,这就是数据驱动UI。
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- if (null == convertView) {
- convertView = new BookView(getContext());
- convertView.setLayoutParameter(new AbsListView.LayoutParameter(150, 150));
- }
- Book book = m_bookList.get(position);
- BookView bookView = (BookView)convertView;
- bookView.setBook(book);
- return convertView;
- }
@Override
public View getView(int position, View convertView, ViewGroup parent) {if (null == convertView) {convertView = new BookView(getContext());convertView.setLayoutParameter(new AbsListView.LayoutParameter(150, 150));}Book book = m_bookList.get(position);BookView bookView = (BookView)convertView;bookView.setBook(book);return convertView;
}
2.1.3 Dialog
- 扩展于Dialog类
- 提供Dialog关闭的事件
- Dialog的高度随内容的变化而变化
- 可以设置按钮的文字,可见性,字体等方法
- 设置按钮点击事件的listener
- 要考虑对话框的三个属性:Title, Content area, Action buttons
2.1.4 Utility
- Log
- DateFormat
- Bitmap
- Notification
- Shared Preference
- Environment
- Device
- ...
2.2 Task管理
线程只是一种机制,保证我们要完成的任务不运行在UI线程(也就是说不阻塞UI),完成的任务才是我们关注的核心,因此,我们可以通过设计,把线程封装,让使用者根本感觉不到是线程,他只用关心他要做的事情就行了。
这里,我们可以设计一种"异步链式调用"的框架,把线程进行了封装。使用都只需要这样用:
- new TaskManager()
- .next(task1)
- .next(task2)
- .next(task3).
- .execute();
new TaskManager()
.next(task1)
.next(task2)
.next(task3).
.execute();
这里,task1, task2, task3是顺序执行的,举个例子:我们要访问网络,取得一个图片,使用这个TaskManager我们需要3个task,
task1:显示一个ProgressDialog。
task2:访问网络,创建bitmap。
task3:关闭对话框,显示bitmap。
这一点,可以参考CoreLib工程中的task.TaskManager类。
关于TaskManager,有以下几点需要注意:
- 封装了线程
- 让调用者只关注自己的业务处理
- 保证顺序链式地执行某一个任务
- 上一个任务的输出,作为下一个任务的输入
- 能暂停、恢复任何一个任务
2.3 缓存设计
- 把内存占用量大的对象存放在缓存中,如bitmap
- 利用了LruCache类来实现
- 利用了AsyncTask类来加载bitmap
- 不用再手动释放bitmap内存,该操作有风险
- 不用再关心AbsListView的scroll状态
关于缓存的更多详细细节,请参考[ 请参考CoreLib工程中的cache包 ]。
这样做,有什么好处, 不用再手动释放bitmap内在,该操作有风险,因为该bitmap是否有View引用,如果当一个View在试图绘制一个已经回收的bitmap,这里会抛出异常。
2.4 线程管理
无消息循环的线程:
- new Thread(null, new Runnable() {
- public void run() {
- // Do you works.
- }
- }, "Thread_name_xxx").start();
new Thread(null, new Runnable() {public void run() {// Do you works.}}, "Thread_name_xxx").start();
什么情况下使用这种线程:
- 做完一件事情就结束,这件事发生频率不高,比如从SD card中读取图片数据
- 不需要复用线程
在使用线程,最好给线程加上名字,这样利用高度与跟踪。
有消息循环的线程:
这样的线程拥有消息循环,当消息队列中没有消息时,这个线程会被挂起。我们要做一件事情时,只需要给它发送一个消息就行了。
这种情况通常是为了复用线程,不用频繁创建线程,比如音乐播放器程序,专门启动一个有消息循环的线程来获得音乐的专辑图片。
我们通常还要创建一个与这个线程的消息循环(Looper)相关联的Handler,由它来处理消息,注意,这做的事情是运行在后台线程的。
3,程序框架如何设计
- UI层
- 数据展示与管理
- 用户交互
- 绘制
- Adapter
- 业务逻辑层
- 持久化数据(内存中,相当于全局数据)
- 数据加式(数据层的数据有时候需要进行加工成UI层需要的数据)
- 数据变化的通知机制
- 数据层
- 数据访问(DB,文件,网络等)
- 缓存(图片,文件等)
- 配置文件(shared perference)
下面,我试着画了一个Android程序的结构,如果有不好的地方,欢迎指正。
4,一些基本原则
下面列出一些通常的原则,我们应当在开发过程中遵循,欢迎补充与指正。
在Activity.onCreate()或者View的构造方法中调用,在以后看代码时,人们通常首先会去找initialize()这样的方法。
把View的点击事件,提成方法,这样在listener处只是一个方法调用者,一般的事件封装为:onXXXClick(View v)。
让所有的Activity都继承自BaseActivity类,这样,我们可以做很多有用的事情
我们应当把Bitmap操作封装起来,比如从文件加载,保存,网络下载,动态计算sample size等。有了封装后,我们可以对其集中优化。
一定要注意绘制方面的东西,不要在onDraw()/onTouchEvent()中创建新对象。
Android 程序框架设计相关推荐
- Android程序框架设计
1.一些概念 模式的定义: 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心.通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作. 什么是设计模 ...
- Android通用框架设计与完整电商APP开发系列文章
作者|傅猿猿 责编|Javen205 有福利 有福利 有福利 鸣谢 感谢@傅猿猿 邀请写此系列文章 Android通用框架设计与完整电商APP开发 课程介绍 [[导学视频](http://szv1.m ...
- android怎么做ab测试工具,开发必读:网易专家解读Android ABTest 框架设计
应用中不同的场景.设计方案,不经过测试,你永远不知道消费者会更偏好哪一种.面对随时可能变更的产品需求,开发人员如何才能在保证测试进程的同时,让工作也变得高效.省力? 本章内容,网易严选Android资 ...
- 基于单片机的嵌入式系统的典型的应用程序框架设计
在单片机应用程序中,最常用.也是最简单的一种典型框架就是前后台系统,这种框架通常是由主函数里的大循环和一个或几个中断服务程序组成,本文主要讲这种典型框架设计问题. 前后台系统适用于一些程序流程简单.实 ...
- 百问网七天物联网课程学习笔记——程序框架设计
以前我一直觉得只有做纯软件的程序员才需要注意程序框架的设计,上了韦东山老师的课之后才觉得做单片机的程序开发注意框架设计也是很必要的事情.要在单片机开发的过程中引入面向对象的思想,这样的代码更容易扩展, ...
- 2021金九银十面试讴歌系列,Android面试不可不看的经验,android网络层框架设计实战
技术博客或者github主页没有什么内容也写到简历里.记住技术博客或者github主页这一类的,本来都属于加分项,可有可无的,但是如果你写了,面试官誓必会满怀期待地点进去看,如果这个时候呈现给他的却是 ...
- Android程序设计基础-设计布局之伪今日头条主界面
一. 实验目的 (1) 掌握Andriod Studio的基本使用方法: (2) 掌握Andriod Studio中常用的控件及其使用方法: 二.实验内容 (1)使用Android Studio编写任 ...
- 【- Flutter Web篇 -】 FlutterUnit web版闪亮登场 ,android网络层框架设计实战
由于我的小破站是在太慢了,使以放在gitee Page 部署,文中也会介绍部署流程. 网站是: http://toly1994328.gitee.io/flutter_web ,点击这里跳转 来一张F ...
- WinForm应用程序框架设计之WinAction(一:显示列表窗体)
我们来先看看WinAction的显示列表窗体的流程: 具体代码参考: public void InitListForm(Form listForm, object entity) ...
最新文章
- 我必须得告诉大家的MySQL优化原理
- 用g++编译C++ 的流程示例如下
- tensoflow_yolov3 计算平均识别个数(平均识别数)
- 多表更新,用一个表更新另外一个表
- Linux基本操作(6)——Linux 重写rm 命令 实现回收站功能
- php和python-Python与PHP的一些区别
- 通过hsv筛选颜色 python_OpenCV-Python 光流介绍(附代码)
- C++并发与多线程(五)互斥量,atomic、与线程池
- garbor 特征 matlab,Gabor小波滤波用于纹理特征提取
- 怎样用python获取财经网新闻
- 使用BouncyCastle 实现RSA常用方法
- srv.exe蠕虫病毒~
- OpenVINO-yolov5推理代码
- SQL 合并两个字段的数据 或者合并时添加符号 如:括号 等
- Android 解析软件包时出现问题 -- Error staging apk from content URI
- java计算机毕业设计飞机航班信息查询系统源码+mysql数据库+系统+lw文档+部署
- 什么是高度塌陷 以及高度塌陷的解决办法
- 中国节日主题网站设计 红色建军节HTML+CSS 红色中国文化主题网站设计 HTML学生作业网页
- 22个值得收藏的android开源代码-UI篇,kotlin类型转换
- 如果要设计个分布式文件系统,该从哪些方面考虑?