您当前的位置: 首页 >  android

代码与思维

暂无认证

  • 3浏览

    0关注

    163博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

代码与思维 发布时间:2022-04-29 15:10:38 ,浏览量:3

学完了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  create(serviceClass: Class): 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  create(): T = create(T::class.java)
}

这里又定义了一个不带参数的create()方法,并使用inline关键字来修饰方法,reified关键字来修饰泛型,这是泛型实化的两大前提条件。

接下来就可以使用T::class.java这种语法了,然后调用上面定义的带有Class参数的create()方法。

此时就有了新的方式获取AppService接口的动态代理对象了:

val appService = ServiceCreator.create()
关注
打赏
1665387627
查看更多评论
立即登录/注册

微信扫码登录

0.0639s