欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

andorid jar/库源码解析之retrofit2

程序员文章站 2022-03-22 23:48:56
目录:andorid jar/库源码解析 Retrofit2: 作用: 通过封装okhttp库,来进行web通讯,并且使用动态代理的方式,来调用接口地址,通过回调赋值结果。 栗子: 定义一个接口,用于访问使用。 public interface IServiceApi { @FormUrlEncod ......

目录: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方法。

  源码:

  引入:

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'