通俗易懂的Retrofit详解
概述
Retrofit主要是利⽤动态代理的⽅式,获取其执⾏时的⽅法上的注解+形参等数据,并保存于serviceMethod对象中。serviceMethod和args(形参的值)全都存⼊OkHttpCall中,serviceMethod.adapt最终返回的是将serviceMethod和okHttpCall绑在了⼀起。调⽤Call的enqueue()—>OkHttpCall的enqueue()—>okhttp的enqueue()。得到数据回调对应的⽅法中
注解
⽅法注解:@GET、@POST、@PUT、@DELETE、@PATH、@HEAD、@OPTION
List item
S、@HTTP。
标记注解:@FormUrlEncoded【返回表单】、@Multipart【⽤于⽂件上传】、@Streaming【返回数据量特别⼤使⽤】。
参数注解:@Query,@QueryMap;@Body;@Field、@FieldMap;@Part,@PartMap。
其他注解:@Path;@Header,@Headers;@Url
流程
interface xxxService {
@GET
Observable<String> get(@Url String url, @QueryMap Map<String, Object> params);
@GET
Observable<String> getRaw(@Url String url, @Body RequestBody body);
@FormUrlEncoded
@POST
Observable<String> post(@Url String url, @FieldMap Map<String, Object> params);
@POST
Observable<String> postJson(@Url String url, @Body RequestBody body);
@GET("wxarticle/list/{id}/{page}/json")
fun getAirticles(@Path("id") id: String, @Path("page") page: String): Call<BaseData>
}
下⾯代码中最后的build作⽤是将前⾯的⼀些参数(baseUrl,转换器,适配器等)什么的都配置到Retrofit对象⾥⾯。
Retrofit mRetrofit=new Retrofit.Builder()
.baseUrl("wanandroid/")
.ate()) //数据解析器
.ate())
.build()
我们先看下前⾯写的接⼝
Call<String> login( @Body User ueser);
如果返回的是Observable格式,则这么定义接⼝:
Observable<String> login(@Body User ueser);
从上⾯可以看到, Retrofit接⼝的返回值分为两部分,⼀部分是前⾯的Call或者Observable,另⼀部分是String。
1)addCallAdapterFactory影响的就是第⼀部分的Call或者Observable,Call类型是默认⽀持的(内部由DefaultCallAdapterFactory⽀持),⽽如果要⽀持Observable,我们就需要⾃⼰添加
ate())
2)addConverterFactory影响的就是第⼆部分以及我们的请求参数,将服务器返回的数据转换成String
/***将接⼝转换成了实现类,调⽤⾃定义api,请求数据***/
/***⽅式⼀***/
Map<String, Object> mParams = new HashMap<String, Object>();
map.put("name","123");
//⽤接⼝⽣成实例
val service= ate(xxxService::class.java)
//调⽤⽅法返回Observable对象
val observable= service.post("xxx/xxx", mParams)
//被观察者订阅观察者,正常应该反过来,其实这么做是为了链式调⽤
observable.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
android retrofitpublic void onNext(Object o) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
/***⽅式⼆***/
//⽤接⼝⽣成实例
val service= ate(xxxService::class.java)
//调⽤⽅法返回Call对象
val airticlesCall = Airticles("408", "1")
//异步请求⽅式
override fun onFailure(call: Call<BaseData>, t: Throwable) {
//请求失败
t.printStackTrace()
Log.e("xfhy", "请求失败")
}
override fun onResponse(call: Call<BaseData>, response: Response<BaseData>) {
/
/请求成功
val baseData = response.body()
Log.e("xfhy", "请求成功 ${baseData?.toString()}")
}
})
通过动态代理的⽅式,获取其执⾏时的⽅法上的注解+形参等数据,并保存于serviceMethod对象中。serviceMethod和args(形参的值)全都存⼊OkHttpCall中,serviceMethod.adapt最终返回的是将serviceMethod和okHttpCall绑在了⼀起。
public <T> T create(final Class<T> service) {
//这⾥传⼊的必须是接⼝
Utils.validateServiceInterface(service);
return (T) ClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
private final Platform platform = ();
@Override public Object invoke(Object proxy, Method method, @Nullable Object[] args)
throws Throwable {
....
//读取method中的所有数据将是⽹络请求的所有⼊参
ServiceMethod<Object, Object> serviceMethod = (ServiceMethod<Object, Object>) loadServiceMethod(method); //各种注解啊,数据啊都传过去 args是⽅法的参数数据
OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.adapt(okHttpCall);
}
});
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论