牢牢记住
所有的第三方库能实现的功能,我们使用原生的API只要花时间和精力也能实现,但是可能会出现很多的bug而且会花费较多的时间和精力,而且性能也不一定很好,第三方的库会帮我们封装底层的一些代码,避免我们做重复多余易出错的事情,让我们专注于业务逻辑,所以学习任何一个第三方库都将是简单的,我们不应心生畏惧。
一些原则
规划好界面层,至少应该遵循几条基本的原则:
保持规范性:定义好开发规范,包括书写规范、命名规范、注释规范等,并按照规范严格执行;
保持单一性:布局就只做布局,内容就只做内容,各自分离好,每个方法、每个类,也只做一件事情;
保持简洁性:保持代码和结构的简洁,每个方法,每个类,每个包,每个文件,都不要塞太多代码或资源,感觉多了就应该拆分。
一种id命名结构:控件_范围_功能,例如:edit_login_password
Android第三方库和框架
开源框架分类:https://github.com/yeungeek/awesome-android-libraries
开源UI框架:https://github.com/yeungeek/awesome-android-ui
异步
AsyncTask和Handler:(Google开发)
- 原生,使用起来会麻烦一点。
Rxjava:(Square开发)
- https://github.com/ReactiveX/RxJava/wiki
- 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库。
- 实现异步操作。相比AsyncTask和Handler等来说更加的简洁,随着程序逻辑越来越复杂它依然能够保持简洁(逻辑简洁而非代码少,使用链式调用)。
- 使用场景和使用方式:和Retrofit结合(网络请求库),和RxBinding结合使用(Binding
API),各种异步操作,RxBus(用RxJava实现EventBus)。 - Android版本RxAndroid。
- 缺点:框架源代码多,可能不大好理解,不熟悉的话使用出bug不好解决。
Agera:(Google开发)
- https://github.com/captain-miao/AndroidAgeraTutorial/wiki
- 一个能帮助Android开发者更好的开发函数式,异步和响应式程序的框架。与RxJava类似。
- 推事件拉数据的架构,使用上没有RxJava方便,核心为Repository接口,它通知观察者数据改变,观察者在收到通知时可以拉取数据。然而该接口并不能使用运算符拼接组成链式操作,只能使用各种操作符来拼接repository本身。
事件总线
EventBus:(greenrobot开发)
- http://greenrobot.org/eventbus/documentation/
- 事件总线,主要用来消息/事件的传递,实现了组建之间的解耦。以观察者模式实现,用于简化程序的组件、线程通信,可以轻易切换线程、开辟线程。
- 用户多,简洁,方便,小巧,文档简洁明了。
Guava:(Google开发)
- 原文https://github.com/google/guava/wiki
中文http://ifeve.com/google-guava/ - 基于开源的Java库,其中包含Google正在由他们很多项目使用的很多核心库
- 一个庞大的工具类库,EventBus只是一个小功能
Otto:(Square开发)
- fork guava ,用的人不少,但是Square已经放弃维护了,集合到RxJava中去
AndroidEventBus:(何红辉)
- 模仿EventBus开发的
网络
Android-Async-Http:(Loopj开发)
- 基于HttpClient,自动智能请求充实,持久化cookie存储。
- Android5.0后不推荐使用HttpClient了,Loopj也停止了维护。
Volley:(Google开发)
- https://github.com/mcxiaoke/android-volley
- 基于HttpUriConnection,封装了UIL图片加载框架、支持图片加载,网络请求的排序、优先级处理,缓存,多级别取消请求,Activity和生命周期的联动。
- 用的人较多,可拓展性好,支持HttpClient、HttpUriConnection和OKHttp,封装性好简洁易用。
- 适合于:轻量级的网络交互:网络请求频繁、传输数据量小。不能进行大数据量的网络操作如下载音视频,所以不适合用来上传文件。
- Request和Response都把数据放入byte数组里,不支持输入输出流,大文件多了数组就会非常大且多,消耗内存,不如直接返回Stream那样具备可操作性。
OkHttp:(Square开发)
- http://square.github.io/okhttp/ https://github.com/square/okhttp
- 高性能Http请求库,支持SPDY,共享同一个Socket来处理同一个服务器的所有请求,支持http2.0和websocket,支持同步异步,封装了线程池、数据转化、参数使用、错误处理等,无缝支持GZIP来减少数据流量,缓存相应数据来减少重复的网络请求,能从很多常用的连接问题中自动恢复,解决了代理服务器问题和SSL握手失败问题。
- 基于NIO和Okio,所以性能好请求和处理速度快,API调用更加简单方便,但是使用时需要多一层封装。
- 适用于:重量级网络交互场景,网络请求频繁、传输数据量大。
- Square公司已经停止维护了,推荐Retrofit。
Retrofit:(Square开发)
- http://square.github.io/retrofit/
https://github.com/square/retrofit - RESTful
API涉及风格,基于OkHttp(Square开发),注解配置请求参数,支持同步异步请求,支持多种数据的解析,可以搭配多种Converter将获得的数据解析和序列化,支持Gson(默认)、Jackson、Protobuf等,提供对RxJava的支持。 - 性能最好,处理最快,扩展性差,高度封装所带来的必然结果-解析数据都是用统一的converter,如果服务器不能给出统一的API形式将很难处理。
- 简洁易用(RESTful设计风格),代码简化(高封装度和注解用法),解耦更彻底,职责更细分,与RxJava结合使用,使用方法较多,原理复杂,存在一定的门槛。
- 适用于:任何场景,特别是后台Api遵循RESTful风格、项目中有使用RxJava。
图片加载
http://www.trinea.cn/android/android-image-cache-compare/
ImageLoader:(nostra13)
- https://github.com/nostra13/Android-Universal-Image-Loader
- 支持下载进度监听,可以在 View 滚动中暂停图片加载,默认实现多种内存缓存算法,支持本地缓存文件名规则定义。
- 功能以及代理容易理解长度都一般。
Picasso:(Square)
- http://square.github.io/picasso/ https://github.com/square/picasso
- 自带统计监控功能,支持优先级处理,支持延迟到图片尺寸计算完成加载,支持飞行模式、并发线程数根据网络类型而变,“无”本地缓存(交给了okhttp)。
- 代码虽然只在一个包下,没有严格的包区分,但代码简单、逻辑清晰,一两个小时就能叫深入的了解完。
Glide:(Sam sjudd)
- https://muyangmin.github.io/glide-docs-cn/
- 图片缓存->媒体缓存,支持优先级处理,与 Activity/Fragment 生命周期一致,支持 trimMemory,支持
okhttp、Volley,内存友好。 - GIF 动画的解码, 本地视频剧照的解码,缩略图的支持,Activity 生命周期的集成,转码的支持(toBytes()
和transcode()),动画的支持,OkHttp 和Volley 的支持。 - 功能强大,但代码量大、流转复杂。在较深掌握的情况下才推荐使用,免得出了问题难以下手解决。Google推荐的图片加载库,专注于流畅的滚动。
Volley ImageLoader:(Google)
- Volley框架自带,不能加载本地图片。
Fresco:(Facebook)
- https://www.fresco-cn.org/
- 能够从网络、本地存储和本地资源中加载图片,为了节省数据和CPU拥有三级缓存,内存管理好,图片的渐进式呈现,支持Gif图和WebP格式,图像的加载允许多方面控制。
数据库ORM
https://www.sitepoint.com/5-best-android-orms/
ORMLite-android:
- http://ormlite.com/ https://github.com/j256/ormlite-android
Sugar ORM
- http://satyan.github.io/sugar/
- https://github.com/chennaione/sugar
GreenDAO
- http://greenrobot.org/greendao/
- https://github.com/greenrobot/greenDAO
Realm
- https://realm.io/
- https://github.com/realm/realm-java
ActiveAndroid
- https://github.com/pardom/ActiveAndroid
Android开发框架
ThinkAndroid:
- 已经停止维护。
- 一个免费的开源的、简易的、遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单、快速的进行Android应用程序的开发,包含Android
mvc、简易sqlite orm、ioc模块、封装Android
httpclitent的http模块,具有快速构建文件缓存功能,无需考虑缓存文件的格式,都可以非常轻松的实现缓存,它还基于文件缓存模块实现了图片缓存功能,在android中加载的图片的时候,对oom的问题,和对加载图片错位的问题都轻易解决。他还包括了一个手机开发中经常应用的实用工具类,如日志管理,配置文件管理,android下载器模块,网络切换检测等等工具。 - 包含模块:
- MVC模块:实现视图与模型的分离。
- ioc模块:android中的ioc模块,完全注解方式就可以进行UI绑定、res中的资源的读取、以及对象的初始化。
- 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。
- http模块:通过httpclient进行封装http数据请求,支持异步及同步方式加载。
- 缓存模块:通过简单的配置及设计可以很好的实现缓存,对缓存可以随意的配置
- 图片缓存模块:imageview加载图片的时候无需考虑图片加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。
- 配置器模块:可以对简易的实现配对配置的操作,目前配置文件可以支持Preference、Properties对配置进行存取。
- 日志打印模块:可以较快的轻易的是实现日志打印,支持日志打印的扩展,目前支持对sdcard写入本地打印、以及控制台打印
- 下载器模块:可以简单的实现多线程下载、后台下载、断点续传、对下载进行控制、如开始、暂停、删除等等。
- 网络状态检测模块:当网络状态改变时,对其进行检测。
LoonAndroid:
- 目标是节省代码量,降低耦合,让代码层次看起来更清晰。
- 框架主要功能:
- 自动注入框架(只需要继承框架内的application既可)
- 图片加载框架(多重缓存,自动回收,最大限度保证内存的安全性)
- 网络请求模块(继承了基本上现在所有的http请求)
- eventbus(集成一个开源的框架)
- 验证框架(集成开源框架)
- json解析(支持解析成集合或者对象)
- 数据库(不知道是哪位写的 忘记了)
- 多线程断点下载(自动判断是否支持多线程,判断是否是重定向)
- 自动更新模块
- 一系列工具类
AFinal:
- (1) 数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。
- (2)
注解模块:android中的ioc框架,完全注解方式就可以进行UI绑定和事件绑定。无需findViewById和setClickListener等。 - (3) 网络模块:通过httpclient进行封装http数据请求,支持ajax方式加载,支持下载、上传文件功能。
- (4)
图片缓存模块:通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。
xUtil:
-
(1) 数据库模块:android中的orm框架,一行代码就可以进行增删改查;
支持事务,默认关闭;
可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名);
支持绑定外键,保存实体时外键关联实体自动保存或更新;
自动加载外键关联实体,支持延时加载;
支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。 -
(2) 注解模块:android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定;
新的事件绑定方式,使用混淆工具混淆后仍可正常工作;
目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。 -
(3) 网络模块:支持同步,异步方式的请求;
支持大文件上传,上传大文件不会oom;
支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求;
下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件;
返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。 -
(4) 图片缓存模块:加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;
支持加载网络图片和本地图片;
内存管理使用lru算法,更好的管理bitmap内存;
可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等…
Web架构风格(知识,而非库)
目前三种主流的web服务实现方法:REST、SAOP、XML-RPC。
REST ful:(Roy Fielding提出)
- Fielding是一个非常重要的人,他是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。
- REST(Representational State
Transfer)描述了一个架构样式的网络系统,Web服务交互方案,没有明确的标准,更像是一种设计风格。 - 原则条件:客户端和服务器之间的交互在请求之间是无状态的。客户端的请求包含所有必须的信息,适合于云计算之类的环境,客户端可以缓存数据以改进性能。服务器端应用程序状态和功能可以分为各种资源(应用程序对象、数据库记录、算法等),所有的资源都共享同一的接口。分层系统,组件无法了解它与之交互的中间件以外的组件,通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。
- 统一接口:数据的元操作,即CRUD(create, read,
update和delete,即数据的增删查改)操作,分别对应于HTTP方法:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。 - URI,即代表资源,不应该有动词,不应该加入版本号。
- 关键在于资源、无状态、统一接口。无状态但是有状态码。
- 本真REST + OAuth是RESTful 是微服务的标配。Base Oauth只用于开发环境。
- Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。比如,当用户向api.example.com的根目录发出请求,会得到一个说明文档。
- 较新型。
ROA:
- 即Resource Oriented Architecture,面向资源的架构。
RPC:
- RPC(Remote Procedure Call)远程过程调用,是实现分布式计算的一种技术。
- RPC基于请求应答模式,客户端发送调用信息(将远程方法名、参数打包进请求信息)到服务端,服务端解析到要调用的对象和方法执行后返回应答信息;客户端接受相应获取应答信息。
WebService:
- 流行的几个框架:Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF、Apache
Wink、Jboss RESTEasy、sun JAX-WS(最简单、方便)、阿里巴巴 Dubbo。
XML-RPC:
- XML-RPC:XML Remote Procedure
Call,即XML远程方法调用,利用http+xml封装进行RPC调用。基于http协议传输、XML作为信息编码格式。一个xml-rpc消息就是一个请求体为xml的http-post请求,服务端执行后也以xml格式编码返回。这个标准面前已经演变为下面的SOAP协议。可以理解SOAP是XML-RPC的高级版本。 - 已经基本被淘汰了
SOAP:
- SOAP(Simple Object Access Protocol,简单对象访问协议)。
- 广泛使用的是基于HTTP和xml协议的实现(SOAP=RPC+HTTP+XML),也就是大家常提的Web
Service使用的通信协议。一个SOAP方法可以简单地看作遵循SOAP编码规则的HTTP请求和响应。 - 较为成熟。
保存测试