0
点赞
收藏
分享

微信扫一扫

Android Retrofit2 Java创建动态代理对象封装

7dcac6528821 2022-05-03 阅读 74

文章目录

前言

最近在学Kotlin,使用Kotlin来写Android,学的时候在看郭霖大神的第一行代码第三版,里面有介绍使用Retrofit2,在平时市面上也是流行使用Rxjava + Retrofit + Okhttp
书上是Kotlin版本的,虽然自己在学Kotlin但是因为还不熟练所以平时还是用Java多一点,就将书上的这部分代码改成Java
(记录在这里也供以后自己可以有思路和思考,并且以后还可以结合Rxjava一起使用) 其实基本都是郭霖大神的第一行代码第三版上的内容

接口创建

要使用Retrofit,我们是要导入依赖的
在这里,因为我将Android Studio更新到了最新的大黄蜂版本
大家更新过应该知道已经改回 mavenCentral()设计库了
所以这里我在百度上搜索 mavenCentral() 找了Retrofit的依赖

    implementation'com.squareup.retrofit2:retrofit:2.9.0'
    implementation'com.squareup.retrofit2:converter-gson:2.9.0'

依赖库自动将Retrofit、OkHttp、Okio一起下载 第二条是转换库转为Gson

创建接口 具体就是不同的api的定义相对路径等等

public interface GoodService {

    @GET("Good/getGoodsByType?page=1&size=6&type=1")
    Call<List<Good>> getGoodData();

    @POST("User/Login")
    Call<ResponseBody> createData(@Body UserSign userSign);

    @GET("User/showUserInfo")
    Call<User> getUser(@Header("Authorization") String token);

    @GET("/TheActivity/login1")
    Call<ResponseBody> postLogin(@Query("username") String username, @Query("password") String password);
}

这里因为我有使用就多写了下面带有Header和Query标签的,具体的话一个是header中指定参数,一个是带参数的GET请求
可以看到,使用标签来声明是GET还是POST等就可以了,然后传入相对路径,根路径我们之后在别的地方写
然后接着写类型和方法名就好了,具体的话可以仔细学习Retrofit
在这只是为了自己简单记一下

数据类就自己写就好了

直接使用

然后我们到Activity中使用:

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.0.11:8080")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        GoodService goodService = retrofit.create(GoodService.class);
        goodService.getGoodData().enqueue(new Callback<List<Good>>() {
            @Override
            public void onResponse(Call<List<Good>> call, Response<List<Good>> response) {
                
            }

            @Override
            public void onFailure(Call<List<Good>> call, Throwable t) {

            }
        });

根路径我们在构建Retrofit之后提供,然后往下根据你调用的接口中的方法就可以将url补充完整
构建Retrofit对象后,调用create()方法创建动态代理对象就好了,然后就是你想接下来做的了,比如更新UI等等

封装功能

最后呢 因为其实构建的Retrofit对象是全局通用的,所以我们在调用create()方式时针对不同的Service接口传入相应的类型就可以了
接下来多写一个封装请求的类

public class Util {
    private static final String BASE_URI = "http://192.168.0.11:8080";
    
    private static final Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URI)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    public static <T> T create(Class<T> serviceClass){
        return retrofit.create(serviceClass);
    }

我们将创建Retrofit对象写在这里 然后有一个外部可见的create()方法 接受一个Class类型的参数,当外部调用这个方法时,实际就是调用Retrofit对象的create()方法 从而创建出Service接口的动态代理对象
然后回到Activity中修改代码:

GoodService goodService = Util.create(GoodService.class);

上面直接使用部分的代码就缩减成这样,然后就是调用接口里面定义的

        goodService.getGoodData().enqueue(new Callback<List<Good>>() {
            @Override
            public void onResponse(Call<List<Good>> call, Response<List<Good>> response) {
                
            }

            @Override
            public void onFailure(Call<List<Good>> call, Throwable t) {

            }
        });

这样子就可以根据不同接口创建动态代理对象,并且创建Retrofit和请求等等都进行封装

在跟着郭霖大神的第一行代码学到很多,这里都是大神书上的,只是用Java将Kotlin书上的内容复刻出来

举报

相关推荐

0 条评论