学完了Retrofit基本用法,但是里面还有一个问题,就是获取Service接口的动态代理对象比较麻烦。大致代码如下:
val retrofit = Retrofit.Builder()
.baseUrl("http://10.0.0.2/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val appService = retrofit.create(AppService::class.java)
想要得到AppService的动态代理对象,需要先使用Retrofit.Builder构建出一个Retrofit对象,然后再调用Retrofit对象的create()方法创建动态代理对象。只写一次还好,但每次调用服务器接口时都要写一遍的话,就比较麻烦了。
事实上,确实也不用每次都写一遍,因为构建出的Retrofit对象是全局通用的,只需要在调用create()方法时针对不同的Service接口传入相应的Class类型即可。因此,我们可以将通用的这部分功能封装起来,从而简化获取Service接口动态代理对象的过程。
新建一个ServiceCreator单例类,代码如下所示:
object ServiceCreator {
private const val BASE_URL = "http://10.0.2.2/"
private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
fun <T> create(serviceClass: Class<T>): T = retrofit.create(serviceClass)
}
内部定义了一个常量BASE_URL,指定Retrofit的根路径。然后构建Retrofit对象。最后,提供了一个外部可见的create()方法,并接收一个Class类型的参数。当在外部调用这个方法时,实际上就是调用了Retrofit对象的create()方法,从而创建出相应Service接口的动态代理对象。
经过这样的封装之后,Retrofit的用法将会变得简单,比如获取一个AppService接口的动态代理对象,只需要:
val appService = ServiceCreator.create(AppService::class.java)
之后就可以调用AppService接口中定义的方法了。
泛型实化优化:
我们还可以通过泛型实化功能来继续优化代码:
object ServiceCreator {
......
inline fun <reified T> create(): T = create(T::class.java)
}
这里又定义了一个不带参数的create()方法,并使用inline关键字来修饰方法,reified关键字来修饰泛型,这是泛型实化的两大前提条件。
接下来就可以使用T::class.java这种语法了,然后调用上面定义的带有Class参数的create()方法。
此时就有了新的方式获取AppService接口的动态代理对象了:
val appService = ServiceCreator.create<AppService>()
网友评论