Retrofit 2.0基于OKHttp更高效更快的网络框架 以及自定义转换器
时间关系,本文就 Retrofit 2.0的简单使用 做讲解 至于原理以后有空再去分析
项目全面、简单、易懂 地址:
关于Retrofit 2.0的简单使用如下: https://gitee.com/bimingcong/MyRetrofit
private void initGet() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://v.juhe.cn/")
.addConverterFactory(GsonConverterFactory.create())
.build();
GetService service = retrofit.create(GetService.class);
final Call<GetBean> call = service.getString3("toutiao", "shehui", "d05b58fa6901ad9bed77a1ef08bd6ccb");
call.enqueue(new Callback<GetBean>() {
@Override
public void onResponse(Call<GetBean> call, Response<GetBean> response) {
if (response.isSuccessful()) {
GetBean = response.body();
}
}
@Override
public void onFailure(Call<GetBean> call, Throwable t) {
}
});
}
其中的GetService是干嘛的 里边的@query其实可以理解为get请求url ?后边那一串参数的键值对
public interface GetService {
//直接拼接,记得加问号
@GET("toutiao/index?type=shehui&key=d05b58fa6901ad9bed77a1ef08bd6ccb")
Call<GetBean> getString();
//{name}可以最简单的将其理解为路径替换块,用”{}”表示,与注解@path配合使用 ,为了解耦,参数name==toutiao
@GET("{name}/index?type=shehui&key=d05b58fa6901ad9bed77a1ef08bd6ccb")
Call<GetBean> getString2(@Path("name") String name);
//对于@GET来说,参数信息是可以直接放在url中上传的。那么你马上就反应过来了,这一样也存在严重的耦合!
//于是,就有了@query
@GET("{name}/index")
Call<GetBean> getString3(@Path("name") String name, @Query("type") String type
, @Query("key") String key);
//假设我要在参数中上传10个参数呢?这意味着我要在方法中声明10个@Query参数?当然不是!
//Retrofit也考虑到了这点,所以针对于复杂的参数上传,为我们准备了@QueryMap
@GET("{name}/index")
Call<GetBean> getString4(@Path("name") String name, @QueryMap HashMap<String, String> hashMap);
//一般Get都没有请求体,所以直接获取接口网址即可 Url动态化
@GET()
Observable<ResponseBody> getString5(@Url String url);
}
针对Post请求 其中的@Field 其实可以理解为 post要提交的 参数键值对 其中还有单个文件 以及多个文件的上传
public interface PostService {
@FormUrlEncoded
@POST("toutiao/index")
Call<PostBean> postString(@Field("type") String type, @Field("key") String key);
// Post表单提交-多个参数-@FieldMa
@FormUrlEncoded
@POST("toutiao/index")
Call<PostBean> postString2(@FieldMap HashMap<String, String> params);
// Post文件提交 ,每个键值对都需要用@Part注解键名字
//Multipart 支持文件上传
@Multipart
@POST("https://pan.baidu.com/disk/home?#/all?vmode=list&path=%2Fas")
Call<TestBean> postFile(@Part("photo\";filename=\"test.png\"") RequestBody body);
@Multipart
@POST("xxxx")
Call<TestBean> postFile2(@PartMap HashMap<String, RequestBody> bodyMap, @Field("token") String token);
}
对应的例子如下:
//当我获取数据成功后要做什么处理
public interface OnSuccessListener {
void onSuccess(Object o); void onFaile();
}
//提供一些方法去调用service实体类的方法,RequestBody上传单个文件
public void uploadFile(RequestBody body, final OnSuccessListener listener) {
Call<TestBean> call = mService.postFile(body);
call.enqueue(new Callback<TestBean>() {
@Override
public void onResponse(Call<TestBean> call, Response<TestBean> response) {
listener.onSuccess(response);
} @Override
public void onFailure(Call<TestBean> call, Throwable t) {
listener.onFaile();
}
}); }
转换器:
至于自定义转换器 就是 下边这个参数
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://v.juhe.cn/")
.addConverterFactory(GsonConverterFactory.create())
.build();
比如我们只希望返回数据是String类型,我们需要自定义一个ConverterFactory
public class StringConverFactory extends Converter.Factory {
public static StringConverFactory create() {
return new StringConverFactory();
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
Retrofit retrofit) {
Log.d("wyz", "读取数据:responseBodyConverter" + type);
if (type == String.class) {//此处的Type类型 我的理解是一开始Call对象参数定义的返回值类型
Log.d("wyz", "执行开始");
return StringResponseBodyConverter.INSTANCE;
}
return null;
}
@Nullable
@Override
public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
Log.d("wyz", "请求数据类型:" + type);
if (type == NetRequest.class){
}
return null;
}
final class StringResponseBodyConverter implements Converter<ResponseBody, String> {
public static final StringResponseBodyConverter INSTANCE =new StringResponseBodyConverter();
@Override
public String convert(ResponseBody value) throws IOException {
Log.d("wyz", "转换开始:" + value);
String s = value.string();
return s;
}
最后将 ConvertFactory设置到Retrofit实例中就可以了
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(getOkHttpClient())
.addConverterFactory(StringConverFactory.create())
日志:
最后对于 红色的部分是添加一个自定义的Client 此处主要是对相应级别的日志去拦截
在retrofit2.0中是没有日志功能的。但是retrofit2.0中依赖OkHttp,所以也就能够通过OkHttp中的interceptor来实现实际的底层的请求和响应日志。在这里我们需要修改上一个retrofit实例,为其自定自定义的OkHttpClient。代码如下:
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.build(); Retrofit retrofit = new Retrofit.Builder().addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
需要添加依赖:
compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'
效果:

更加详细的Demo 可以去我的开源中国里看 https://gitee.com/bimingcong/MyRetrofit
Retrofit 2.0基于OKHttp更高效更快的网络框架 以及自定义转换器的更多相关文章
- Adaptive Execution如何让Spark SQL更高效更好用
1 背 景 Spark SQL / Catalyst 和 CBO 的优化,从查询本身与目标数据的特点的角度尽可能保证了最终生成的执行计划的高效性.但是 执行计划一旦生成,便不可更改,即使执行过程中发 ...
- 如何更高效地定制你的bootstrap
bootstrap已经作为前端开发必不可少的框架之一,应用bootstrap使得我们对布局.样式的设定变得非常简单.但bootstrap提供的默认样式往往不能满足我们的需求,从而定制化bootstra ...
- Retrofit 2.0:有史以来最大的改进
因为其简单与出色的性能,Retrofit 是安卓上最流行的HTTP Client库之一. 不过它的缺点是在Retrofit 1.x中没有直接取消正在进行中任务的方法.如果你想做这件事必须手动杀死,而这 ...
- 这些小工具让你的Android 开发更高效
在做Android 开发过程中,会遇到一些小的问题.尽管自己动手也能解决.可是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vy ...
- 25个让Java程序员更高效的Eclipse插件
Eclipse提供了一个可扩展插件的开发系统.这就使得Eclipse在运行系统之上可以实现各种功能.这些插件也不同于其他的应用(插件的功能是最难用代码实现的).拥有合适的Eclipse插件是非常重要的 ...
- [源码解析]为什么mapPartition比map更高效
[源码解析]为什么mapPartition比map更高效 目录 [源码解析]为什么mapPartition比map更高效 0x00 摘要 0x01 map vs mapPartition 1.1 ma ...
- 阿里面试:MySQL如何设计索引更高效?
有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...
- 企业需要使用网络损伤仪 WANsim 的帮助,以便更高效地迁移到云端
正确解决与云环境中的应用程序部署有关的问题需要针对每个系统的独特需求以寻找特定的网络工具.网络损伤仪 WANsim 助力企业更高效地迁移到云端! 起初,云厂商以在云端办公相对于传统方式拥有更高的可靠性 ...
- K8s 如何提供更高效稳定的编排能力?K8s Watch 实现机制浅析
关于我们 更多关于云原生的案例和知识,可关注同名[腾讯云原生]公众号~ 福利: ①公众号后台回复[手册],可获得<腾讯云原生路线图手册>&<腾讯云原生最佳实践>~ ②公 ...
随机推荐
- CentOS 7 快速部署 ELK
先简单说一下部署思路及原理(不一定正确,只是个人理解而已) 1.修改系统参数,以便安装软件 2.安装配置elasticsearch,这个相当于总监测中心,用来收集logstash监测的各种服务应用日志 ...
- Web前端入门教程之浏览器兼容问题及解决方法
JavaScript 被称为JS,是作为浏览器的内置脚本语言,为我们提供操控浏览器的能力,可以让网页呈现出各种特殊效果,为用户提供友好的互动体验.JS是Web前端入门教程中的重点和难点,而浏览器兼容性 ...
- 如何将极客时间课程制作成kindle电子书
订阅了几个极客时间的专栏,一直没有时间去看. 最近,想着如果把内容制作成电子书,利用上下班时间学习一下,岂不是很方便? 在网上搜到一个很好用的开源软件,几分钟就可以把极客时间的专栏做成电子书,简直太棒 ...
- js中 var functionName = function() {} 和 function functionName() {} 两种函数声明的区别
js中有两种声明函数的方法,分别为: var functionOne = function() { // Some code }; function functionTwo() { // Some c ...
- django 获取用户提交的数据 文件 表单
templates: <div> <form action="/detail" method="post" enctype="mul ...
- Android控件使用FragmentTabHost,切换Fragment;
大部分APP的主界面都很类似,要么底部导航的,要么就是侧滑菜单,还有底部导航+侧滑菜单的:底部导航实现大概有几种方式: TabHost+Fragment RadioGroup+Fragment Fra ...
- C# 操作符 << 与 >>
1.<< 左移操作符: 左移操作符,将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0.左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8. 如:x< ...
- dll 恐怖的代码调整
总结一波这998的不得不提的调整代码的心得. 调整代码的背景:现有wps美化代码分散在各个插件里面,导致每次修改一小部分代码,都要全新编译,并且只能跟版本发,所以决定将wps的美化代码整合成一个插件d ...
- scrapy-logging
import logging logger = logging.getLogger(__name__) # 当前文件位置 logger.warning('haha') # debug info 201 ...
- python常用库,包网址
常用包下载:https://pypi.org/ 1.NumPy: https://www.numpy.org/ 2.pandas: http://pandas.pydata.org/ 3.SciPy: ...