学习Android之Retrofit构建器的最佳写法

Retrofit构建器的最佳写法

  学完了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>()

 

  

posted @ 2022-03-15 23:15  PeacefulGemini  阅读(159)  评论(0)    收藏  举报
回顶部