一个介绍第三方开发组件很好的文章
今天咱们聊聊Android的第三方开发组件。
AndroidAnnotation
官方网站
首先推荐AndroidAnnotation, 按官方网站的说法就是
Fast Android Development. Easy maintainance。
AndroidAnnotation的ViewByID,Preference,UI线程,后台线程,点击事件处理等特性, 可以让你少些非常多代码, 非常显著的提高android开发效率。
AndroidAnnotation利用的是java的annotation, 类似于预编译指令, 在编译时生成代码, 再进行编译。所以不管是用eclipse还是用idea都需要经过一些配置。配置的方法在官方文档都有介绍, 非常简单。文档地址
Android-Query
官方网站地址
Android-Query(AQuery) 是用来处理网络请求和操作ui的组件。官方对这个组件的定位是:
Our goal is to make Android coding simpler, easier, and more fun!
AQuery 提供一种对ui的链式处理方式, 试图简化ui操作的代码。
public void renderContent(Content content, View view) {
AQuery aq = new AQuery(view);
aq.id(R.id.icon).image(R.drawable.icon).visible().clicked(this, "someMethod");
aq.id(R.id.name).text(content.getPname());
aq.id(R.id.time).text(FormatUtility.relativeTime(System.currentTimeMillis(), content.getCreate())).visible();
aq.id(R.id.desc).text(content.getDesc()).visible();
}
个人比较喜欢的不是这部分对ui的操作, 我一般用AndroidAnnoation直接处理ui操作, 那更简洁更接近Android原生处理的方式。
AQuery最优秀的是对网络请求的处理, 它支持异步网络请求, 网络请求缓存。
AQuery aq = new AQuery(view);
aq.id(R.id.image1).image("http://www.vikispot.com/z/images/vikispot/android-w.png");
以上代码自动加载指定链接的图片, 并在加载完毕后显示在相应的组件上。若是自己写代码加载图片, 那叫一个痛苦啊。
还有更牛逼的。
//load an image from network, but only cache with file
//this image is huge, avoid memory caching
boolean memCache = false;
boolean fileCache = true;
aq.id(R.id.image1).image("http://www.vikispot.com/z/images/vikispot/android-w.png", memCache, fileCache);
以上代码, 自动将图片缓存在文件里, 下次再加载图片就不用再发起网络请求了。
更况且, 这么牛逼的组件大小只有96.5KB。
Google Cloud Message, GCM
许多人不敢用GCM,一个是担心网络被墙, 一个是担心Google服务框架的普及度。国内google服务确实很多被墙, 非常不稳定。 但GCM却是例外, 看看你的gmail的新邮件通知, 你就明白了。而对于Google服务框架在手机的普及度, 我想我们不用太担心, 的确是很多山寨机的rom里面没有带着个Google服务框架, 但大部分正规厂商已经非常重视这个问题, 像华为,中兴,魅族,小米等都有内嵌Google服务框架。另外, 并不是说没有Google Market, Google Sync, 就不能用GCM, 在部分华为手机上就是这样。
千万要慎重考虑自己搭建push服务器, 这个成本, 不管是开发成本还是维护成本, 都是小的创业公司难以承受的。Push 服务与传统的网页服务器有很大的区别, 传统的网页服务器请求过程短, 连接建立, 请求,回复,断开连接, 没有长期与服务器建立连接,不会给服务器造成很大的压力。而Push 服务就很不同, 技术实现也非常不同, 需要长时间与服务器建立连接, 空闲度很高,效益比很低。
我是做国外产品的, 利用Google Analytics 做过简单的统计,有近99.32%的设备是支持GCM的。
GCM做的真是不错, 我是吃过亏的。 中国人就是贪, 什么事情都想自己做, 什么都做不好。 我们自己做过Push服务, 结果 开发难度,效果和维护成本我们都很难承受;可是老板要, 我们只能硬着头皮上, 做到后面又被迫迁移到GCM上来。
GCM的效果非常好, 只要是网络有连接, 不管是你的手机怎么样, 都可以立即通知到消息。
这个组件的配置方式很简单, 说明文档在android开发者网站.
最近看了MiUI v5,发现这货竟然开始不内嵌Google Service Framework了, 既然这样, 上面的啰嗦, 大家就视而不见了吧。
据说国内做的比较好的是个推, 没试过, 不知道怎么样。
Google Analytics
谷歌分析不是必须的, 你可以选择国内的友盟统计。 友盟的统计会相对简单了些, 但应该能满足日常的需求。
再啰嗦一句, 千万也不要自行统计。 不光服务器代码要自己开发, 手机端还要处理网络不存在时的缓存处理。 最难的是还要自己写脚本分析数据。 不说别的, 光一个简单的用户地理位置分析, 估计就能搞死你。
所以, 我的同胞们, 我们的老板们, 现成的优秀的组件要会用, 不要什么都自己想着自己做, 你是做产品的不是做统计的, 那是友盟的活, 你都做了人家怎么活?
greenDAO
网站
这是我认为最好的Android ORM了。Android支持SQlite数据库, 但那个数据库操作叫一个复杂啊, 不光代码难看, 维护起来还非常不方便。一般我都不用数据库存储, 能文件就文件存储了, 直到我直到了greenDAO。 这货解决了一个大难题。
greenDAO分成两部分, 一部分用于生成数据库操作代码, 一部分用于在Android工程里面提供底层支持。greenDAO对每一个表都生成相应的对象, 在查询,插入等操作时只需要对这个对象进行操作就可以了。可以非常优雅的完成数据库操作的指令。
我知道某些服务器后端程序员,开始撅嘴了:笑话, 我们服务器后端有多少多少好的ORM, 不知道比你这个好上多少倍!
我们是搞Android开发的好不好, android才不过五六年的时间好不好!
我们先来看看一段代码:
QueryBuilder qb = userDao.queryBuilder();
qb.where(Properties.FirstName.eq("Joe"),
qb.or(Properties.YearOfBirth.gt(1970),
qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));
List youngJoes = qb.list();
这就是greenDAO里面的数据库查询, 简单吧? 赶快来用用吧!
Log4j
官方网站
做软件开发, 没有个日志组件是不行的。 Android原生的日志服务太简陋了, 连输出的文件都没有。
android-log4j配置稍微有些麻烦, 需要下载多个jar包, 包括log4j, android-log4j等。 我自己用proguard封了一个包, 用来输出日志到文件没有问题, 提供给大家。下载地址
final LogConfigurator lc = new LogConfigurator();
lc.setFileName(PATH_LOGGER_FILE);//日志文件路径
lc.setFilePattern("%d - [%-6p-%c] - %m%n");//日志输出格式
lc.setMaxBackupSize(2);//最多的文件备份个数, 超过后log4j将自行删除
lc.setMaxFileSize(1024 * 1024);//最大的日志大小, 超过后log4j将备份下来, 再新建一个文件。
lc.setRootLevel(Level.DEBUG);
// Set log level of a specific logger
lc.setLevel("org.apache", Level.DEBUG);
lc.configure();
把上述代码, 放在程序初始化的过程中。
private Logger logger = Logger.getLogger("LoggerName");
logger.debug("Log text");
就可以输出日志到文件了。
Common IO
官方网站
Common IO跟log4j同属于Apache开源基金会。 主要对文件操作, 数据流操作提供了非常多简单的函数。
gson
官方网站
不知道大家平常与服务器端做数据通信是用什么协议的, 千万不要自己发明啊。我见过最奇葩的通信协议是: 一个字段标示后面数据的长度, 然后拼接成字节数组作为通信协议。这种方式开发难不说, 调试起来非常不方便。 更奇葩的是, 还有人一直坚持的这么用, 真是不思进取啊。
我们经常用的是json。 协议非常简单, 还是明文的, 非常容易调试。 前后端合作非常顺畅。
gson的工作是把json的字符串直接转换为java的对象, 也可以把java的对象直接转换为字符串。 使用方式非常简单。
另外google有一个非常高效的数据协议叫protobuf,据说也很好, 不过数据没有json明文好调试, 一直都没有用。
最后还要吐槽下:若是网络链接是https, 不管是url还是返回的数据都是加密传输的, 不需要再什么DES加密一次了, 这是多次一举。