[转]Android 程序框架设计

【安卓架构师】【高焕堂】【android从程序员到架构师】从零开始进阶安卓架构师 从第一次写出Hello World,到成为一个优秀的工程师的距离有多远? android从程序员到架构师之路课程,遵循敏捷的迭代过程,从思想、方法、模式、范例和成功案例各种不同角度,带你学习从设计到代码的途径。让你在活泼的过程中,轻松地从原本的代码世界,迅速熟悉设计的新天地。 学习目录 1.复习基本OOP知识a 2.复习基本OOP知识b 3.复习基本OOP知识c 20:00 阅读详情

1、一些概念

模式的定义:

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

什么是设计模式?

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

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

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

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

概念完整性

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

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

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

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

4)概念完整性表现有:

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

如何保持概念完整性

1
2
3
4
5
- 在制度上给予保证,产品的负责人必须建立技术上的绝对权威
- 技术负责人员(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。

 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 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),完成的任务才是我们关注的核心,因此,我们可以通过设计,把线程封装,让使用者根本感觉不到是线程,他只用关心他要做的事情就行了。
这里,我们可以设计一种"异步链式调用"的框架,把线程进行了封装。使用都只需要这样用:

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
利用了LruCache类来实现
利用了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,由它来处理消息,注意,这做的事情是运行在后台线程的。

3,程序框架如何设计

Android程序的结构

UI层
数据展示与管理
用户交互
绘制
Adapter
业务逻辑层
持久化数据(内存中,相当于全局数据)
数据加式(数据层的数据有时候需要进行加工成UI层需要的数据)
数据变化的通知机制
数据层
数据访问(DB,文件,网络等)
缓存(图片,文件等)
配置文件(shared perference)

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

1358936690_5445.png

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://my.eoe.cn/blue_rain/archive/3631.html

9、设计可访问的应用程序 本文详细介绍了如何设计可访问的移动应用程序,涵盖Android可访问性框架的基础知识、语音识别和文本转语音服务的应用,以及高级可访问性功能如手势反馈、高对比度模式等。同时,文章还提供了测试和优化可访问性的方法,帮助开发者创建更加包容和用户友好的应用程序。 阅读详情

相关推荐

Android聊天室B/S

开发环境为Android Studio 2.2.3 API26。利用JSON代码搭建服务器端,实时与客户端进行交互。UI界面简洁,运行时需要在客户端和服务器端在同一局域网内,并且要先开启服务器端,然后连接手机。

软件架构常用设计

常用系统架构设计

shaderdx的专栏 1万+

基于深度学习方法(7种)的高光谱与多光谱图像融合(附代码+3个数据集获取)

其他不懂的可以把代码发给AI哦,让它给你解读。

热爱分享,热爱记录 1298

Android 程序框架设计

这篇文章主要内容来自于之前我讲的一个PPT文档,现在将其整理如下。欢迎指正。以下的内容都是来自于我自身的经验,欢迎大家多提自己的建议。 1、一些概念 模式的定义: 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。 什么是设计模式? 设计模式是在某种特别的情况下,针对某种问

永远即等待的专栏 4万+

8、对比 LightGBM、XGBoost 和深度学习

本文对比了LightGBM、XGBoost和深度学习模型(特别是TabTransformer)在处理表格数据时的性能差异。从模型复杂度、数据准备、训练时间、准确性和适用场景等方面进行分析,重点探讨了三者在人口普查收入预测任务中的表现。文章详细介绍了XGBoost与LightGBM的核心特性与区别,深入讲解了TabTransformer的架构与实现,并涵盖了分类特征编码、缺失值处理和类别不平衡等关键数据预处理技术,为选择合适的表格数据建模方法提供了实践指导。

julia4scientist的博客 120

【AI智能体】飞书 AI 智能客服机器人搭建与使用实战操作详解

飞书 AI 智能客服机器人搭建与使用实战操作详解

congge 6046

外国大神手把手教你如何设计软件架构

如果您定义了要构建的内容,那将是最好的。你不必确切地知道它是如何工作的,但你应该知道结果是什么样子的。在这里,您可以定义用户的需求以及他们想要的方式。需求的编写方式应使其易于理解、实用且可实现。首先,使用利益相关者访谈或调查来获取他们对系统设计的意见;这将帮助您了解他们的需求、他们在当前策略中遇到的问题以及如何用您的策略解决这些问题。分析现有软件包以获取灵感;看看是否有任何类似的程序可以做与你的类似的事情,或者其他人是否已经用他们的解决了这个问题。这样,您将无需重新发明轮子,从而节省时间!

qq_35922145的博客 896

基于STM32L4XX的环境光传感器(VCNL4040M3OE)应用程序设计

• 集成模块:红外发射器(IRED)、环境光传感器(ALS)、接近传感器(PS)及信号调理IC。#define VCNL4040_I2C_ADDR (0x60 << 1) // 7位地址左移一位。// 组合成16位值。// I2C总线句柄。// 设置参数:ALS集成时间160ms,中断禁止,ALS功能开启。// 设置参数:PS工作频率80Hz,开红外二极管,PS功能开启。// 初始化I2C外设。• 输出类型:I2C总线(ALS/PS)// 2. 配置环境光传感器 (ALS) 并启动。

myron6688的博客 143

框架设计原理与实战:框架的性能优化策略

1.背景介绍 随着计算机技术的不断发展,软件开发的规模和复杂性也不断增加。为了更好地组织和管理代码,软件开发人员开始使用框架。框架是一种软件设计模式,它提供了一种结构化的方法来组织代码,以便更容易地实现特定的功能。 框架通常包含一个核心部分和一些可扩展的模块。核心部分提供了基本的功能和结构,而扩展模块则可以根据需要添加或修改。这种模块化设

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 297

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

第一次安装宝塔mysql服务是默认关闭的,需要手动打开,打开服务再次进入phpMyAdmin发现可以进入了。

吻等离子的博客 2869

【实战】YOLOv5/v8模型→RK3588 NPU高效部署:模型转换/量化/精度调优完整指南​

摘要: 本教程详细介绍了YOLOv5模型在RK3588 NPU上的优化部署流程,重点解析了架构转换与量化技术。通过将检测头输出结构与decode操作分离,显著提升了模型在NPU上的兼容性和计算效率。LetterBox预处理方案有效保持图像宽高比,相比直接resize提升检测精度。INT8量化技术采用非对称量化策略,通过scale和zero_point参数实现浮点到整数的转换,在保证精度的同时大幅提升推理速度。实验表明,优化后的模型在RK3588上实现了高效的实时目标检测性能,为边缘AI部署提供了完整解决方案

LXY_LOVE36的博客 625

「C/C++」C/C++搭建程序框架

具体的框架和结构将根据项目的需求和规模而有所不同。通过选择合适的方法和工具,可以使程序更加可维护、可扩展和可测试。设计模式是解决特定问题的经验总结,可以在程序中提供一致性的结构和行为。使用开源或第三方库和框架可以加速开发过程,并提供可靠的功能和性能。这样可以方便地追踪和回滚代码的改动,以及与团队成员之间的协作。在代码中处理异常和错误可以提高代码的鲁棒性和容错能力。单元测试和集成测试可以在开发过程中自动化进行,帮助检测和修复潜在的问题。在C++中,搭建程序的框架有许多种方法,取决于项目的规模和复杂性。

何曾参静谧的博客 1357

YOLOv11全网首发:注意力独家魔改 | 具有切片操作的SimAM注意力,魔改SimAM助力小目标检测

1)直接作为注意力使用,效果秒杀SimAM;2)高效和卷积结合,代替原始网络的卷积操作;

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1570

[转]Android程序框架设计

这篇文章主要内容来自于之前我讲的一个PPT文档,现在将其整理如下。欢迎指正。以下的内容都是来自于我自身的经验,欢迎大家多提自己的建议。 1、一些概念 模式的定义: 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。 什么是设计模式? 设计模式是在某种特别的情况下,针对某种问题的某种...

weixin_30751947的博客 64

多组学联合高级Mantel-test热图

对应的是「metabo」中物质间的相关性热图,单元格色块颜色表示相关系数大小,橙色表示+相关,绿色表示-相关;单元格内的数值表示相关性值大小,星号表示显著性。双组学(微生物组/ 转录组/代谢组等两两组合)关联分析,可视化组学特征间的关联显著性、强度及相关方向。表示<trans>与<metabo>中物质的Mantel test结果。表示整体相关的系数,连线颜色表示相关系数的显著性检验结果。宿主-微生物互作、疾病多组学机制、环境-生物多组学关联。为物质名称,不允许存在空值、重复值。

多组・学・多组学 360

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android 程序框架设计-转

Android 程序框架设计 1、一些概念 模式的定义: 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。 什么是设计模式? 设计模式是在某种特别的情况下,针对某种问题的某种典型、通用的解决方法。 我们是需要适当了解并学习一些设计模式,在程序开发过...

weixin_30871701的博客 165

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

安卓源码Android沁恒USB转串口芯片CH340通信程序:开启安卓串口通信新篇章

安卓源码Android沁恒USB转串口芯片CH340通信程序:开启安卓串口通信新篇章 去发现同类优质开源项目:https://gitcode.com/ 在安卓开发领域,串口通信一直是一项挑战性的技术。然而,有了Android沁恒USB转串口芯片CH340通信程序,这一挑战变得不再困难。下面,我们就来详细了解这个项目的核心功能、技术分析、应用场景以及项目特点。 项目介绍 Android沁恒USB转串...

gitblog_06718的博客 915

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

(一)前端程序员转安卓开发分析和规划建议

前端程序员转行到安卓开发是完全可行的,但需要付出努力和时间。你的前端经验(如UI设计、网络通信)是宝贵的起点,通过系统学习Kotlin、安卓基础和高阶知识,结合实践项目,你可以逐步掌握安卓开发技能。

cuijiying的博客 1718

安卓进阶之android系统架构

安卓进阶知识之android系统架构学习的笔记,结合了《进阶之光》、一些博客、官方文档和个人的理解

Suzy_MM的博客 3348

安卓android记单词软件

基于安卓的记单词软件,用户在第一次使用的时候,需要点击注册登录,在登录成功后会有引导页面,引导页面可以简单介绍软件使用,用户可以跳过。引导页面后,会跳转到选择词汇本页面,选择完词汇本后,跳转至设置计划页面,设置完学习计划后,会跳转至首页面,在首页可以查看单词的学习进度等信息,有三个学习单词的按钮,分别是“开始记单词”,“单词回顾”,“单词测试”用于不同的学习功能,可以搭配学习使用。在“我的”里面。具有查看收藏信息,更换单词本、等其他功能。 开发环境: 前端:android studio 后端:jdk1.8

执笔浮云的博客 5659

基于安卓Android的红色文物APP小程序设计(源码+lw+部署文档+讲解等)兼容小程序app

基于安卓 Android 的 php 红色文物 APP 小程序是一款具有重要意义和价值的应用程序。 这款 APP 小程序利用安卓 Android 系统的广泛适用性和强大的功能,结合 php 语言在服务器端的高效处理能力,为用户带来全新的红色文物体验。在前端,通过精心设计的界面,用户可以直观地浏览红色文物的图片、介绍和历史背景等信息。 它为用户提供了一个便捷的平台,让人们能够随时随地了解红色文物的故事和价值。用户可以通过搜索功能快速找到特定的红色文物,深入了解其背后的革命历史和英雄事迹。同时,APP 小程序还

全网粉丝10W+、全栈领域优质创作者、掘金、阿里云等社区博客专家 1153

USB转串口程序代码:轻松实现安卓设备串口通信

USB转串口程序代码:轻松实现安卓设备串口通信 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在众多开发者和工程师的需求中,USB转串口程序代码应运而生。该项目通过Android Studio开发,实现了安卓手机USB口与串口之间的通信。用户仅需通过安卓设备,即可轻松实现数据传输和控制串口设备,极大地方便了开发调试过程。 项目技术分析 USB转串口程序代码主要利用了A...

gitblog_06702的博客 783

2024年末知识大总结:Java程序员转Android开发必读经验一份

ListView的滑动操作就是一个很好的例子,不需要用户任何的思考,只需顺着期待的内容出现的方向滑动,这样 intuitive的设计便是王道。上述的操作都有一个共同特点——手势操作。但同样的思路就完全不适用于移动端了 (反例我是实在想不起来了,大家可以帮忙想想),相信一个cluttered ui的app,就算功能再强大,用户盯着你的界面超过3s就会头晕,点击某个button要点好几下才会成功,也必定是一个糟糕的app。在移动设备的开发上,我归结为三大类问题:性能的问题,界面响应的问题,产品的稳定性。

2501_90223544的博客 1331

Android程序框架设置

转自: http://blog.youkuaiyun.com/leehong2005/article/details/8535306

u013714419的专栏 870

安卓Android入门

Android基于Linux内核,这使得它具有强大的硬件兼容性和稳定性。

m0_74154295的博客 2274

基于安卓Android的红色文物app-毕业设计

随着移动互联网技术的快速发展,红色文化的传播与保护逐渐受到重视。为了更有效地展示红色文物,提升公众对红色文化的认知与兴趣,本文设计并实现了一款基于安卓Android平台的红色文物APP。该APP集红色文物展示、信息查询、用户管理等功能于一体,旨在为用户提供便捷、全面的红色文化体验。

QQ511008285的博客 1810
上一篇: Android中LocationManager的简单使用03
下一篇: session和cookie的一些理解
geekcoder
博客等级 码龄14年 78粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值