android程序经典架构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android 程序框架设计

1、主要说明

框架说明:

1 基于HTTP 协议进行通信

2 利用json 格式传输数据。

客户端以POST 方式用UTF-8编码提交网络请求,主要模块有通用framework,view 视图,业务逻辑(系统调度)模块,本地数据处理模块,http 模块,工具类。http 请求解析,传输到业务处理模块,然后本地处理数据模块进行文件保存,若展示则 通过业务处理模块,最终在view 视图上显示。

2、设计细项

2.1 共通类的设计

概念完整性:

1 2 3 4 5 - 开发过程中,需求、设计、编码的一致性 - 整个程序具有统一的风格,比如对话框样式,按钮风格,色调等UI 元素 - 整个程序具体统一的结构,比如不同模块访问网络,它们的调用方式一致,例如异步访问都用回调方式通知结果,相同的功能应该提取成共通模块。 - 开发人员能很好的执行需求人员和设计人员的意图。 - 有完整的文档,需求文档,设计文档,测试文档,处理流程的文档等。

2.1.1 Widget 设计

尽量在style 文件中定义样式。

TextView

EditText

Button

Title bar

Tool bar

### 为什么要提供这些共通控件? ###

统一字体大小,如App 字体不随系统字体变化而变化

统一UI 式样,如Button , EditText 具有相同的背景等

复用代码

2.1.2 Adapter Items

根据式样,提取需要在AdapterView 中显示的Item

简单的复合布局

自绘制,从而提高滑动性能

- ListView 中放Gallery 时,提高上下滑动性能

- 尽量优化绘制

### 数据驱动 ###

Adapter Items 提供核心的方法

- setData(Object data)

- getData();

Adapter#getView 实现更加简单

- 实现简单

- 不会因为UI 变化而变化

下面代码示例了Adapter#getView()方法的实现,它返回BookView ,BookView 提供方法来接收数据,至于BookView 的显示,则根据设置的数据来显示,这就是数据驱动UI 。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Override

public View getView(int position, View convertView, ViewGroup parent) {

if (null == convertView) {

convertView = new BookView(getContext());

convertView.setLayoutParameter(new

youtParameter(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 ),完成的任务才是我们关注的核心,因此,我们可以通过设计,把线程封装,让使用者根本感觉不到是线程,他只用关心他要做的事情就行了。

这里,我们可以设计一种”异步链式调用”的框架,把线程进行了封装。使用都只需要这样用: 1 2 3 4 5 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

利用了Cache 类来实现

利用了AsyncTask 类来加载bitmap

不用再手动释放bitmap 内存,该操作有风险

不用再关心AbsListView 的scroll 状态

关于缓存的更多详细细节,请参考[ 请参考CoreLib 工程中的cache 包 ]。

这样做,有什么好处, 不用再手动释放bitmap 内存,该操作有风险,因为该bitmap 是否有View 引用,如果当一个View 在试图绘制一个已经回收的bitmap ,这里会抛出异常。

2.4 线程管理

无消息循环的线程:

1 2 3 4 5 6 new Thread(null, new Runnable() {

public void run() {

// Do you works.

}

}, "Thread_name_xxx").start();

什么情况下使用这种线程:

-做完一件事情就结束,这件事发生频率不高,比如从SD card 中读取图片数据 不需要复用线程

在使用线程,最好给线程加上名字,这样利用高度与跟踪。

有消息循环的线程:

这样的线程拥有消息循环,当消息队列中没有消息时,这个线程会被挂起。我们要做一件事情时,只需要给它发送一个消息就行了。

这种情况通常是为了复用线程,不用频繁创建线程,比如音乐播放器程序,专门启动一个有消息循环的线程来获得音乐的专辑图片。

我们通常还要创建一个与这个线程的消息循环(Looper )相关联的Handler ,由它来处理消息,注意,这做的事情是运行在后台线程的。

相关文档
最新文档