作为一个开发者来说,避免重复造轮子是很重要的,能让你节省很多时间去专注于开发自己的业务。2018年已经过去一大半了,今天介绍下今年以来业界内比较推崇的几个框架,希望能提高大家的开发效率。
Retrofit是一个可以把 REST API定义成接口的HTTP客户端。用它可以轻松简洁的管理请求 Header, Body和参数。 Retrofit也支持同步和异步调用
interface ApiService {
@GET("movie/{id}")
fun getMovieDetails(@Path("id") id: String) : Call<MovieDetails>
}
当然它也支持Rx,如果你习惯用RxJava的话它也可以提供同样的链式调用。
Moshi是一个将JSON转换成Java或者Kotlin对象的库。很多人把Moshi类比GSON3.0,然而Moshi比GSON有更多的优点。 它速度更快,而且兼容Kotlin,还能可控的抛出异常。 这是一段用Moshi进行转换的Kotlin代码
val moshi = Moshi.Builder().build()
val jsonAdapter = moshi.adapter(Model::class.java)
/* JSON to Model */
val model = jsonAdapter.fromJson(json)
/* Model to JSON */
val json = jsonAdapter.toJson(model)
Chuck是一个HTTP嗅探的工具,它可以监听你应用的HTTP请求,然后在通知栏显示出http的log。 你可以点击通知栏的Chuck来进入Chuck的界面去查看完整的http请求记录。测试团队也可以通过Chuck来检验某个问题是Android端的还是服务端导致的。 Chuck有时候功能不仅可以代替log,因为app在重启之后可能会丢失log记录,而Chuck会记录下来。
众所周知,Android在处理图片方面的系统API非常不友好。甚至在缩放图片的时候经常发生OOM。Glide是一个图片处理库,它提供了非常简洁方便的API给开发者随意的处理图片。
GlideApp.with(context)
.load(url)
.centerCrop()
.placeholder(R.drawable.ic_placeholder)
.into(imageView)
Glide可以非常方便的通过url加载图片,它也提供回调方法,缓存和缩放各方面的功能。如果在没有Glide的情况下来实现这些功能是非常痛苦的一件事情。Glide甚至支持简单的图片变形,比如处理成圆形。
ThreeTen是一个处理日期和时间的Library。它满足 JSR-310标准,在Java8里已经作为标准库被集成到 java.time.* 包里面。它之所以火起来是因为标准的Android Calendar API非常不友好。一段ThreeTen的demo代码像下面这样
/* Current DateTime */
LocalDateTime.now()
/* String to DateTime */
val localDateTimeString = "2011-12-03T10:15:30"
val localDateTime = LocalDateTime.parse(localDateTimeString)
对比另外一个处理时间日期的库 JodaTime,ThreenTen更小,方法数更少。ThreeTen的API也更简洁。不过如果你的项目已经在使用JodaTime,不建议换到ThreeTen,如果是新项目的haul,强烈建议使用ThreeTen。
Timber是一个基于Andorid Log的log库。Android的log功能不够强大,很多项目都开发了自己的log工具。Timber可以轻松的打开和关闭log,它对string log的格式化,还有异常的处理也都有很好的支持。很多开源项目看中了Timber的这一点,用它作为核心库之一。
/* Log error */
Timber.e("Error happened")
/* Log warning with params */
Timber.w("Your variable value is %s", variable)
/* Log exception */
try {
...
} catch (e: Exception) {
Timber.e(e)
}
Room是Android官方的ORM框架。ORM是以面向对象的思路来处理数据/数据库的一种技术。Room提供跟Retrofit类似的完美的API接口。同时它也依赖注解和标准SQL语法。
@Dao
interface MovieDao {
@Query("SELECT details FROM movies WHERE id = :id")
fun getMovieDetails(id: String): MovieDetails
}
Room也支持Rx和LiveData,所以你可以随心所欲地使用它。跟其他ORM框架对比的话,Room不需要阅读复杂的文档才能明白如何使用,它没有复杂的API。这样是它的优势。
RxJava是 ReactiveX API的一个Java实现,它用链式调用的方式代替了原有Java的编程思维。开发者更愿意看到实时更新的UI,换句话说他们更愿意看到UI能随着数据的变化而自动更新。 当我们在处理数据的时候,通常在切换线程和错误,还有在多个API之间调用的时候情况会变的复杂。RxJava能很好的处理这种情况。虽然RxJava不容易上手,但真的很值得花时间去学习掌握。当RxJava跟Kotlin结合的时候,两者的优点被一起放大,会让开发者爱不释手。
Single.zip(
/* Execute first API call and retry twice if it fails */
apiService.getMovieActors(id).retry(2),
/* Execute second API call and retry twice if it fails */
apiService.getMovieDetails(id).retry(2),
/* Receive successful results and merge them into single model */
BiFunction<List<Actor>, MovieDetails, Movie> { actors, details -> Movie(details, actors) }
)
/* Execute API calls on IO thread */
.subscribeOn(Schedulers.io())
/* Receive results on MainThread */
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(
onError = { /* Handle error */ },
onSuccess = { /* Handle full movie data */ }
)
上面这段代码可以尝试用Java来实现,你会疯的。
Android KTX是一个把Android API用Kotlin封装起来的库。这个库的目标是让Android API使用起来更友好。它把Kotlin上很多不错的Feature都移植了过去,包括命名参数,lambda表达式,默认参数值。
/* Display View */
view.isVisible = true
/* Apply padding to all sides */
view.setPadding(padding)
/* Update padding on any side */
view.updatePadding(left = newPadding, right = newPadding)
/* Quick Toast */
toast("Display test toast")
/* New way to create bundle */
bundleOf {
"key1" to item1
"key2" to item2
}
/* Better way to use SharedPreferences */
sharedPreferences.edit {
putString("key1", "value1")
putString("key2", "value2")
}
Android KTX支持了很多扩展功能,想深入了解的唯一方法是取阅读它的源码看它是怎么支持的。KTX改变了开发者使用Android API的方式,如果你的项目使用的是Kotlin,那么它应该成为你的核心库之一。
没有Dagger的排行榜不完整。Dagger是一个编译器注入的依赖注入框架。它跟RxJava一样虽然不够容易理解,但是在上手之后会对你的项目带来非常大的便利。 关于Dagger,google有一个著名的咖啡机的例子可以了解一下,我之前也发过几篇分析的文章,可以了解一下Dagger2应用:接入Dagger2 Android应用:@Component和@ModuleDagger2 Android应用:@Scope和@Subcomponent总的来说,依赖注入是一种把小模块以最少努力的方式提供给其他模块使用的方式。简单的话拿汽车作为例子,你可以轻易的更换轮胎的类型而不需要对汽车本身做什么修改。 对于大型项目来说,开发者不希望手工地去处理依赖注入,因为这不容易维护。Dagger通过注解帮开发者完成了这些事情。 之前Dagger在服务端大型项目上应用比较多,去年开始Google也把Dagger作为Android的模块之一合并进了Android项目了。
==== 今日沙雕 ====