App 的整体架构
App 结构,应具有清晰的层次划分、同一层模块间充分解耦、模块内部符合面向对象设计六大原则。
App 的整体架构整体分为:
- 应用层:直接面向对象,如:支付,地图,社交等。
- 基础框架层:组件层(二维码、推送、手势、事件总线等)、基础层(网络通信、数据库、JSON解析等)、跨平台层(日期、日志、线程等)。
选择开源框架
- 特性:是否满足项目的需求;
- 可用性:是否提供简洁的API;
- 性能:性能不能太差;
- 文档:是否比较齐全,且可读性强;
- 技术支持:遇到问题是否能及时得到官方技术支持;
- 大小:会影响到Apk的大小;
日志
- Logger:对系统 Log 类的封装。支持跳转到源码处,支持格式化输出 Json、Xml。不支持集合类格式输出。只支持输出日志到 Logcat (Android 中的一个命令行工具,可以用于得到程序的Log信息)。
- LogUtils:支持集合类格式的输出。 (https://github.com/pengwei1024/LogUtils)
- timber:可扩展的框架,支持不同类型的日志记录,如:Logcat、文件、 网络等 (https://github.com/jakeWharton/timber)
Json 解析
- Gson(232k):出自Google,可以将Json字符串反序列化为对应的 Java 对象,或者反过来将Java 对象序列化为对应的Json字符串。(https://github.com/google/gson)
- Jackson(1.5M):包括(core:Json 流处理核心库;databind:数据绑定函数库,实现对象与json的相互转换;annotations:databind使用的注解函数库)。由于包含很多非必要的API,会加大Apk的Size。(https://github.com/FasterXML/jackson;https://github.com/FasterXML/jackson-core)
- Fastjson(417k):出自阿里巴巴,号称目前Java语言中最快的 Json 库。由于是Java 通用的,对于Android来说就多了许多冗余代码,专门的Android版(fastjson.android(256k)),去掉了一些Android虚拟机dalvik不支持的功能,减小 jar包大小。
- LoganSquare(307k):其底层基于jackson 的 streaming API ,使用 APT(Android Annotation Tool)实现编译时注解。从而提高Json解析和序列化的性能。
- 注:从大小和性能上考虑,fastjson.android 适合作为 json 解析和序列化。
数据库
- ActiveAndroid:极大的简化数据库的使用,使用面相对象的方式管理数据库。每一个数据库表都可以被映射为一个类,开发者只需要使用类似 save、delete等函数操作数据库。目前处于维护阶段,最新一版是在2012年发布的。(https://github,.com/pardom/ActiveAndroid)
- ormlite:包括两部分(core-核心模块,无论哪个平台都要基于这个核心库;android-针对Android 平台的适配模块)。目前处于维护阶段,最新一版在2013年发布。(https://github.com/j256)
- greenDAO:一个轻量级且快速的ORM框架,主要针对Android高度优化和定制,性能优于前两个。(https://github.com/greenrobot/greenDAO)
- Realm:是一个全新的移动数据库引擎,既不是基于 ios 的 Core Data,也不是基于SQLite。快速高效的实现数据操作。有点:跨平台、用法简单、可视化操作(Realm 提供了一个轻量级的可视化工具。缺点:jar包有点大,主要原因是 so 库较多,用的时候可以只使用 armeabi-v7a 和 x86两个平台)(https://realm.io/)
网络通信
- Android-async-http(1.2M):最经典的网络异步通信函数库,如今由于比较大,而不太常用(https://github.com/loopj/android-async-http;https://hc.apache.arg/httpcomponents-client-ga/)。
- OkHttp(392k):支持HTTP/2 和 SPDY,对同一台主机的所有请求共享同一个socket;当 SPDY 不可用时,使用连接池减少请求的延迟;透明的GZIP压缩减少下载数据大小;缓存响应避免重复的网络请求。OkHttp 依赖于 okio(可以更方便的访问、存储和处理数据)。(https://github.com/square/okhttp)
- Volley(94k):Volley 特别适用于数据量小等通信频繁的场景。在Android 2.2 之前 Volley 底层使用 Apache HttpClient,在 Android 2.3 之后 其底层使用 HttpURLConnection 发送网络请求。而且开发者很容易将网络栈切换到OkHttp。(https://android.googlesource.com/platform/frameworks/volley;https://github.com/mcxiaoke/android-volley).
- Retrofit(333k):确切的说,Retrofit 并不是一个完整的网络请求函数库,而是将 REST API 转换成 Java 接口的一个开源库,它要求服务器 API 接口遵循 REST 规范。基于注解使得代码变得更加简洁。Retrofit 默认情况下使用 GSON 作为 Json 解析器,使用 Okhttp 实现网络请求,通常三者配合使用。
图片缓存和显示
- BItmapFun(71k):一个入门图片缓存,以前用的多些,如今越来越多的强大的框架出现,现在不再使用。(https://developer.android.com/training/displaying-bitmaps/index.html)。
- Picasso(120k):除了实现图片的下载和二级缓存,还解决了一些问题,如在Adapter中正常的处理Image View回收和下载的取消;使用尽量小的内存实现复杂的图片变换(https://github.com/square/picaso)。
- Glide(475k):和 Picaso 很相似,除了静态图片,Glide 也支持 Gif 格式图片的显示。默认使用 HttpUrlConnection 作为网络请求。可以根据实际需要选用网络库(Https://github.com/bumptech/glide)。
- Fresco(3.4M):最显著的特点是具有三级缓存,其他还有渐进式的加载 JPEG 图片;显示 GIF 和 WebP 动画;可扩展,可自定义的图片加载和显示;在 Android 4.x和 以下版本,将图片放在 内存一个特殊环境,从而使得应用更加流畅,极大的减少了 OOM 错误。(https://github.com/facebook/fresco)
Android-Universal-Image-Loader(162k):同步或异步的多线程图片加载;高度可自定义;支持二级缓存(https://github.com/nostral3/Android-Universal-Image-Loader) - 注:根据图片显示和缓存的需求从低到高
BItmapFun < Picasso < Android-Universal-Image-Loader < Glide < Fresco
网友评论