zoukankan      html  css  js  c++  java
  • andorid jar/库源码解析之retrofit2

    目录:andorid jar/库源码解析 

    Retrofit2:

      作用:

        通过封装okhttp库,来进行web通讯,并且使用动态代理的方式,来调用接口地址,通过回调赋值结果。

      栗子:

      定义一个接口,用于访问使用。

    public interface IServiceApi {
        @FormUrlEncoded
        @POST("login")
        Call<LoginResult> login(@Field("name") String name, @Field("pwd") String pwd);
    
        @GET("getinfo")
        Call<UserInfo> getinfo(@Query("token") String token);
    
        @GET("getinfo2")
        Call<UserInfo> getinfo2(@Query("token") String token);
    }

      调用接口1.可以在main中调用,因为是通过异步执行(enqueue)

    Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl("http://192.168.86.11:8087/").build();
            IServiceApi api = retrofit.create(IServiceApi.class);
            Call<LoginResult> call = api.login("test", "test1234");
            call.enqueue(new Callback<LoginResult>() {
                @Override
                public void onResponse(Call<LoginResult> call, Response<LoginResult> response) {
                    LoginResult loginResult = response.body();
                    if(loginResult != null) {
                    }
                }
    
                @Override
                public void onFailure(Call<LoginResult> call, Throwable t) {
                    Log.i(tag, "ex " + t.getMessage());
                }
            });

      调用接口2.可以在main中调用,因为是通过异步执行(enqueue)

    Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl("http://192.168.86.11:8087/").build();
            IServiceApi api = retrofit.create(IServiceApi.class);
            Call<UserInfo> call = api.getinfo("testtesttest");
            call.enqueue(new Callback<UserInfo>() {
                @Override
                public void onResponse(Call<UserInfo> call, Response<UserInfo> response) {
                    UserInfo userInfo = response.body();
                    if(userInfo != null) {
                    }
                }
    
                @Override
                public void onFailure(Call<UserInfo> call, Throwable t) {
                    Log.i(tag, "ex " + t.getMessage());
                }
            });

      同步调用接口3.

    Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl("http://192.168.86.11:8087/").build();
            IServiceApi api = retrofit.create(IServiceApi.class);
            Call<LoginResult> call = api.login("test", "test1234");
            try {
                Response<LoginResult> resultResponse = call.execute();
                LoginResult result = resultResponse.body();
            }catch (Exception e){
                e.printStackTrace();
            }

      源码解读:

      A:异步调用

      1、创建一个Retrofit对象。

      2、retrofit.create(IServiceApi.class); // 使用Proxy.newProxyInstance 创建一个接口的代理对象。内部使用 ServiceMethod配合OkHttpCall调用,构造他们需要的对象数据

      3、调用enqueue,内部构造okhttp3.Call对象,执行对象的enqueue方法。然后在okhttp3$Callback方法中,调用retrofit2的 回调,赋值成功和失败。

      B:同步调用

      1、同理,同步调用,最后也是调用的。okhtt3.Call的execute方法。

      源码:https://github.com/square/retrofit

      引入:

    implementation 'com.squareup.retrofit2:retrofit:2.0.2'
    implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
  • 相关阅读:
    部署openstack的官网文档解读mysql的配置文件
    ubuntu14.04行更新软件包
    Ubuntu14.04上修改主机名
    ubuntu上修改root密码
    在ISE查看各个模块消耗的资源
    132
    Aurora 8B/10B、PCIe 2.0、SRIO 2.0三种协议比较
    NAND flash和NOR flash的区别详解
    FPGA三分频,五分频,奇数分频
    以太网之物理层
  • 原文地址:https://www.cnblogs.com/Supperlitt/p/12773936.html
Copyright © 2011-2022 走看看