天天看点

Android第三方库和框架

牢牢记住

所有的第三方库能实现的功能,我们使用原生的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请求和响应。

  • 较为成熟。