不知不觉2018年已经过了大半,来总结一下今年用到的一些好用的框架和第三方库,包括App架构、异步通信库、注入注解框架、网络请求库、图片加载库、动画库、数据库、音频视频库、平台分享库、蓝牙库、权限请求库等。
一、App架构
MVP模式:因为 Android 并没有严格的业务和界面区分,项目一庞大,就很容易使代码结构显得越来越乱。现在 Android 端对 MVP 模式讨论越来越热,谷歌6.0API以及更多的体现了MVP设计思维,觉得 MVP 是非常适合 Android 上的APP 开发。但是目前的框架使用起来都太繁琐,要建立一大堆的文件和类,希望后续有简化这些操作的技术出现。
MVVM :这是因为开始官方支持 DataBinding,把 MVVM 直接带到 Android 中。数据绑定在 Windows WPF 和 Web (尤其JSP中)已经非常常见,它非常高效的开发效率,让你只关心你的数据和业务。这也对 Android 开发来说,无疑是一个非常重大的里程碑,MVVM模式将原来更新UI的操作从activity或fragment中剥离出来,由ViewModel来统一完成UI更新。
这两个模式在我们的项目中,已经大量使用。我们的大致流程是这样的:在activity或fragment中使用Dagger2注入一个专门用于请求数据的类(比如Presenter类),然后通过Presenter来进行数据请求(有可能是异步的),请求的数据返回后,再通过activity或fragment中定义的ViewModel来更新UI,因此在整个过程中,activity和fragment只起到衔接作用,所有工作都分配给别的类做,所以activity和fragment中代码很少。
模块化:模块化不是什么新鲜东西了,但是很多人忽视这个android自带并且提倡的功能。模块化就是将我们的app按照功能划分为许多的模块,方便管理和修改。android开发本身提供了项目模块化的方法,其实创建App工程时,android系统就为我们提供了一个默认的名为app的模块。模块化的好处就是软件功能清晰,单模块编译速度快,方便修改,并且方便复用。比如我们将蓝牙功能、分享功能专门弄成一个个模块。在很多项目中就可以复用这些模块;而且模块化都是尽量通过接口来访问模块,模块功能划分清晰有利于软件解耦。一个比较好用的第三方模块化支持库是阿里的Arouter,可以很好的解决模块间的通信问题。模块化最大的问题是,如果模块划分太细太多,会影响模块集成后的编译速度。
二、异步通信库
异步操作(多线程切换)很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。 Android 创造的AsyncTask和Handler,其实都是为了让异步代码更加简洁。RxJava是函数响应式编程,它的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。
比如下面这个异步操作,按照传统的异步处理方式,代码有一堆的缩进,不易读:
new Thread() {
@Override
public void run() {
super.run();
for (File folder : folders) {
File[] files = folder.listFiles();
for (File file : files) {
if (file.getName().endsWith(".png")) {
final Bitmap bitmap = getBitmapFromFile(file);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
imageCollectorView.addImage(bitmap);
}
});
}
}
}
}
}.start();
但是如果使用如下·Rxjava方式写,就简洁易懂多了:
Observable.from(folders)
.flatMap((Func1) (folder) -> { Observable.from(file.listFiles()) })
.filter((Func1) (file) -> { file.getName().endsWith(".png") })
.map((Func1) (file) -> { getBitmapFromFile(file) })
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((Action1) (bitmap) -> { imageCollectorView.addImage(bitmap) });
现在很多其它的库都有Rxjava扩展,使整个app业务流程都可以用Rxjava串起来,因此,Rxjava是本人强烈推荐的一个库。在导入这些库时要注意Rxjava包重复导入或者版本问题。Rxjava目前已经发展到2.0,语法有些变化,但是基本思想还是一样的。由Rxjava延伸出来的库还有:
RxAndroid,函数响应式编程, 把 RxJava 带到 Android 环境中。很多时候,编写 Android 程序,你也可以看成是数据的处理和流动,换一种思想编程,曾经看起来很棘手的问题,瞬间就很优雅的解决了,相信你会被这种build模式的开发会越来越爱。
RxBinding,是 Jake Wharton 的一个开源库,它提供了一套在 Android 平台上的基于 RxJava的 Binding API。所谓 Binding,就是类似设置 OnClickListener 、设置 TextWatcher 这样的注册绑定对象的 API。例如,下面这个按钮Button防抖处理(避免按钮重复点击问题):
button = (Button) findViewById( R.id.bt ) ;
RxView.clicks( button )
.throttleFirst( 2 , TimeUnit.SECONDS ) //两秒钟之内只取一个点击事件
.subscribe(new Action1<Void>() {
@Override public void call(Void aVoid) {
Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show();
}
}) ;
有了Rxjava,先前流行的发布、订阅的轻量级事件总线框架EventBus可以用Rxjava来替代。
另外,很多第三方库也有对应的Rxjava扩展,所以现在可以说Rxjava在android中已经无孔不入了。因为好用,就连iOS也有人专门开发了对应的Rxswift。
三、注入注解框架
Dagger2:android提供的一个注入注解框架,与Spring 的IOC差不多吧。这个框架它的好处是它没有采用反射技术(Spring是用反射的),而是用预编译技术。Dagger2功能是很强大的,但是Dagger2使用起来还是不太容易理解。
四、网络请求库
okhttp,在Android开发中,它已经成为眼下最火的http请求框架了。
Retrofit,与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用Retrofit来进行网络请求了,并且Retrofit支持Rxjava扩展,可以将网络请求整合到Rxjava业务流中。
五、图片加载库
早先时候在图片加载方面,我们大量使用Picasso这个库,它是Square的开源项目,在图片下载、缓存、管理等方面提供了极大的方便。但是后来发现在大量本地图片加载方面会出现加载失败问题,再加上Picasso库已经很长时间没有更新,于是改用另一个流行库Glide,Glide是google员工在Picasso基础上进行优化,总体比Picasso更优秀,在Google很多项目在用。
六、SQLite数据库
DBFlow:一个简化SQLite数据库使用的第三方库,有专门的Rxjava扩展库,可以配合Rxjava使用。
LitePal:一个Android库,使得开发人员使用SQLite数据库非常容易。
七、动画库
viewanimator:android本身提供了AnimatorSet这个类来支持几个连续或同时的动画,比如一个视图从(0,0)这个位置移动到(100,100),同时视图顺时针旋转90度。但是如果动画连续效果很多,代码量就会增加,显得代码很凌乱,代码不易读。viewanimator代码类似Rxjava的链式结构,动画过程一目了然,碰到页面里有多个视图需要动画并且有一系列连续动画时可以使用这个库。使用很简单只要在build.gradle里面导入:implementation ‘com.github.florent37:viewanimator:1.0.5’(最后面的版本号有可能会更新)。
Lottie:你如果是程序员,我相信你一定会爱死这个库。这个库充分体现了一句话:每个人都做自己擅长的事。或许这是趋势吧,未来如果都往这个方向发展,程序员就可以将更多的精力关注在业务逻辑方面,而不是成天被UI这些东西搞得死去活来。按照传统的方法,一个动画效果,程序员从接到手到开发结束,往往都要被设计师扒一层皮,因为动画的过程需要程序员用代码来实现,动画效果往往很难一次性达到设计师的要求,所以调整、调整……永无止境的调整。有了Lottie这个库之后,动画效果是由设计师自己决定的,设计师使用AE等软件生成包含一套动画效果的.json文件,程序员只是将这个文件加载到app里面,用Lottie库提供的一个视图装一下,而且android和iOS可以共用一套动画效果(效果好不好,跟程序员一毛钱关系都没有,一定有程序员在偷笑)。至于这个库的使用方法网上很多,自己搜索一下。
八、权限请求库
EasyPermission:一个简化Android 6.0项目用户权限设置的库,使用很简单。
RxPermissions:一个关于用户权限设置的库,该库在项目运行时动态进行权限请求,支持RxJava2。
九、日志打印库
logger:简单、漂亮、强大的日志记录器。
另外还有:支持Rxjava的蓝牙库、支持各个平台的分享库、好用的音频视频库等,在这里就不一一列举了。有兴趣的小伙伴可以联系我的微信:1914532832,添加时请注明:android开发。欢迎提意见交流。
原文发布时间为:2018-11-28
本文作者:yuchu1900
本文来自云栖社区合作伙伴“终端研发部”,了解相关信息可以关注“终端研发部”。