[转]Android程序框架设计

这篇文章主要内容来自于之前我讲的一个PPT文档,现在将其整理如下。欢迎指正。以下的内容都是来自于我自身的经验,欢迎大家多提自己的建议。

1、一些概念

模式的定义:

每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。

什么是设计模式?

设计模式是在某种特别的情况下,针对某种问题的某种典型、通用的解决方法。

我们是需要适当了解并学习一些设计模式,在程序开发过程中,总是会涉及到一些框架设计,模块设计之类的东西,如果能很好理解并运行设计模式,你所设计的模块或框架将会要稳定得多,因为这些设计模式它们都是通用的解决方案,是经过实践经验了的。

比如说,在程序里,可能会有通知模块,A模块的数据发生变化,B模块需要得到通知,对于这样的需要,你可能会想到用"广播","消息"或者"回调"的方式来解决,的确,刚才我所说的那三种也能解决,但是,这三种都是存在一些缺点,比如说广播,用Intent来传输数据很困难,对于"消息",无法很好的跟踪,对于"回调",有可能你A与B模块根本不可相互访问。此时,如果你会用观察者模式的问题,这种问题可以很轻松解决。

当然,这里是需要具体问题具体分析的,我主要的意思就是说,要适当利用模式,我们不能为了用模式而去用模式,我们是要用模式来解决我们实际的问题。

概念完整性

关于概念完整性,在《人月神话》一书在有大量的阐述,这里,我把我的理解写出来,与大家分享。

1)概念完整性是系统设计中最重要的考虑因素。当你的系统规模越大,这一点体现得越明显。

2)为了获取概念的完整性,设计必须由一个人或者具有共识的小型团队来完成。这一点很好理解,关于设计,可以让所有的人参与,但是决定权在少数人手里,如果大家都想参与设计,这是根本没有办法保证系统设计是统一完整的。

3)要获得概念上的完整性,就必须有人控制这些概念,类似于贵族的专制统治。这里,对于团队中的项目经理或架构师必须对项目有绝对的权威,不然,这个项目里面的就无法统一号令。

4)概念完整性表现有:

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

如何保持概念完整性

- 在制度上给予保证,产品的负责人必须建立技术上的绝对权威
    - 技术负责人员(SE,SL)必须严格执行项目的需求,设计,必须深入到编码细节
    - 在不同阶段,保持与所有人员的持续沟通,鼓励开发人员提意见。
    - 让开发人员参与设计,但不决定设计
    - 通过持续的反馈和沟通来实现模块重用

2、设计之前应该做什么

2.1 共通类的设计

2.1.1 Widget设计

  • 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。

@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();

这里,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();

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

  • 做完一件事情就结束,这件事发生频率不高,比如从SD card中读取图片数据

  • 不需要复用线程

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

有消息循环的线程:

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

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

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

3,程序框架如何设计

Android程序的结构

  • UI层

    • 数据展示与管理

    • 用户交互
    • 绘制
    • Adapter
  • 业务逻辑层
    • 持久化数据(内存中,相当于全局数据)

    • 数据加式(数据层的数据有时候需要进行加工成UI层需要的数据)
    • 数据变化的通知机制
  • 数据层
    • 数据访问(DB,文件,网络等)

    • 缓存(图片,文件等)
    • 配置文件(shared perference)

下面,我试着画了一个Android程序的结构,如果有不好的地方,欢迎指正。

4,一些基本原则

下面列出一些通常的原则,我们应当在开发过程中遵循,欢迎补充与指正。

4.1 提供initialize()方法

在Activity.onCreate()或者View的构造方法中调用,在以后看代码时,人们通常首先会去找initialize()这样的方法。

4.2 封装点击事件

把View的点击事件,提成方法,这样在listener处只是一个方法调用者,一般的事件封装为:onXXXClick(View v)。

4.3 设计一个BaseActivity类

让所有的Activity都继承自BaseActivity类,这样,我们可以做很多有用的事情

  • 定义共通属性

  • 显示共通对话框(Progress dialog)
  • 取得top activity
  • 可以手动管理启动的activity

4.4 设计Application类

  • 存全局数据,比top activity, application context。

4.5 异常处理

  • 报告功能是处理异常的精髓

  • 在finally块中执行清理操作
  • 不要用try-catch-finally来判断业务逻辑
  • 考虑设计自定义的异常类

4.6 标注的使用

  • 重写的方法一定要加@Override

  • 不使用的方法,不要删除,可以标记为@Deprecated,这个做法在维护型的项目中特别有用。

4.7 注册与反注册

  • 局部广播

  • 各种listener
  • Service等

4.8 封装Bitmap操作

我们应当把Bitmap操作封装起来,比如从文件加载,保存,网络下载,动态计算sample size等。有了封装后,我们可以对其集中优化。

4.9 绘制处理

一定要注意绘制方面的东西,不要在onDraw()/onTouchEvent()中创建新对象。

源文章:[http://blog.csdn.net/leehong2005/article/details/8535306]

[转]Android程序框架设计

时间: 2024-07-30 13:51:59

[转]Android程序框架设计的相关文章

Android 程序框架设计

1.一些概念 模式的定义: 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心.通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作. 什么是设计模式? 设计模式是在某种特别的情况下,针对某种问题的某种典型.通用的解决方法. 我们是需要适当了解并学习一些设计模式,在程序开发过程中,总是会涉及到一些框架设计,模块设计之类的东西,如果能很好理解并运行设计模式,你所设计的模块或框架将会要稳定得多,因为这些设计模式它们都是通用的解决方案,是经过实践经验

iOS程序框架设计之皮肤切换功能 (白天与夜间效果)

iOS程序框架设计之皮肤切换功能 一.引言 移动应用的开发中,有时我们会需要例如更换皮肤此类的功能,andorid采用xml配置UI的方式,这个问题或许还容易解决些,iOS的主要UI逻辑则是在代码中控制的,如果没有一个强大的框架方案,这个问题将变得非常棘手.网上也有很多诸如此类功能的优秀案例与框架,在这篇博客中,我与大家分享下我的解决方案,其中如果有不恰或者糟糕之处,希望与高人一起交流. 二.设计思路与框架 首先我的设计思路是采用通知的方式,原理可以如下理解为以下几步: 1.在系统的通知中心注册

Android App框架设计之编写基类BaseActivity

Android App框架设计之编写基类BaseActivity 编写基类BaseActivity - OOP里面子类里面能够共享父类的方法,提高代码的可复用性 - 基类的编写要根据实际项目的情况,有的可能很简单 比如只是显示 "关于" 信息, 业务功能非常少 你可以不用继承基类进行扩展 BaseActivity继承Activity 还是 FragmentActivity 还是其它? 也是根据你的技术要求,因为解决问题的方法有很多种,或者你根本不用写基类也能完成工作. 我们的目的是编写

Android通用框架设计与完整电商APP开发

第1章 课程介绍及APP效果展示(Java版)本章概述了本课程大家能学到什么,老师如何讲解,为什么这么讲解,并介绍了框架的整体架构设计与模块分解,最后展示了用自己设计的框架开发出来的完整电商APP的效果图(服务端API快速搭建教程:http://www.imooc.com/article/19001) ...1-1 课程导学1-2 项目架构设计与模块分解 第2章 项目初始化本章将从零搭建一个空项目,实践项目搭建的过程,并额外教大家搭建一个基于Go语言的Web版Git服务器,实现代码托管的自举.(

WPF 应用程序框架设计-范例

在前一篇(WPF Base Control 设计要项) 有提到如何在 User Control 中关闭父窗口, 本文范例是再延伸设计, 通常一个应用程序中会实践许多的窗口与控件, 如何让这些控件与窗口之前, 保持着有关系而且可以是松散的架构. 应用程序所开发的 Window 与 User Control? 都改继承自行开发的类, 由父层将两者关联, 并可以进行相关事件操作, 类关联图如下: download code : 点这里 Dotblogs Tags: WPF 原文:大专栏  WPF 应用

Android 开发快速导引:Android程序框架【草】

概述 学习一项新技术之前要先了解这个技术的整体框架,这里先简单说一下 Android 的程序结构. Android App 有四个顶层的类:Activity.Service.ContentProvider.BroadcastReceiver. 顶层类 Activity Activity 是 Android 应用最重要的概念,没有之一.当你打开一个 App,你看到的界面就是一个 Activity.里面的图片.按钮.输入框.列表,都是这个 Activity 里的 View. Service 猜都猜得

Android程序性能设计最佳实践

Android应用应该要很快,更精确的说应该是要有效率.那就是说移动设备环境中有限的计算能力和数据存储,很小的屏幕,有限的电池寿命中要更有效率. 这篇博客我就会向你展示为性能而设计的最佳实践. 1. 避免创建对象 对象的创建在android中开销要比在java中大的多.尽量去避免创建一个对象,越多的对象意味着越多的垃圾回收,越多的垃圾回收意味着用户会觉得有点"小卡". 一般的说,尽可能避免创建短暂的临时变量,更少的对象创建意味着更少的垃圾回收,将会提升用户体验.如果能创建一个"

01 Taro_Mall 开源多端小程序框架设计

项目介绍 Taro_Mall是一款多端开源在线商城应用程序,后台是基于litemall基础上进行开发,前端采用Taro框架编写,现已全部完成小程序和h5移动端,后续会对APP,淘宝,头条,百度小程序进行适配.Taro_Mall已经完成了 litemall 前端的所有功能 扫码体验 由于小程序没有认证,只发布了一个预览版,只能加15个人,如有需要,请点击小程序申请 小程序 h5移动端 项目架构 项目用Taro做跨端开发框架,Taro基本采用React的写法,项目集成了 redux dva 控制单向

Android应用程序框架之无边界设计意图

Android的应用框架的外特性空间的描述在SDK文档有十分清楚的描述,Android应用的基本概念,组件生命周期等等有详细的描述.在外特性空间中,Android提供了Activity,Service,Broadcast receivers,Content Provider,Intent,task等概念,我在这里不讨论这些概念定义,因为SDK文档已经讲得够详细. 在阅读SDK文档和研究Activity这个概念时,我感觉到了在Android中若隐若现的Android自由无边界这个设计意图.Andr