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