自定义Retrofit转化器Converter
我们来看一下Retrofit的使用
interface TestConn {
//这里的Bitmap就是要处理的类型 @GET("https://ss0.baidu.com/73F1bjeh1BF3odCf/it/u=2537069448,2929136489&fm=85&s=85B8ED321DD844CA4EED10DE000070B1")
Call<Bitmap> getString();
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.baidu.com/") .addConverterFactory(ScalarsConverterFactory.create()) .addConverterFactory(BitMapCoverterFactory.create())
.build();
ScalarsConverterFactory 就是一个转化器 支持转为字符串 也就是说处理类型为String
BitMapCoverterFactory 这是我自定义的一个转化器 可以转换为Bitmap对象(处理类型为Bitmap)
这里有个坑 addConverterFactory 顺序很重要 假设ScalarsConverterFactory(在上面的代码中第一个add的) 也可以处理Bitmap的话那么 第二个BitMapCoverterFactory 并不会调用,除非ScalarsConverterFactory 返回null
我们要做的就是写一个BitMapCoverterFactory
教程
我们先来导入Retrofit的依赖
compile 'com.squareup.retrofit2:retrofit:2.1.0'
创建一个类并且继承Converter.Factory 类
我们来看一下这个类abstract class Factory {
//从名字就可以看到这个是请求后调用
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
Retrofit retrofit) {
return null;
} //从名字就可以看到这个是请求前调用
public Converter<?, RequestBody> requestBodyConverter(Type type,
Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
return null;
} //由于不常用所以这里介绍
public Converter<?, String> stringConverter(Type type, Annotation[] annotations,
Retrofit retrofit) {
return null;
}
}来看看我们代码
static class BitMapCoverterFactory extends Converter.Factory {
@Override
//方法为网络调用后 使用
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
//如果出类型为Bitmap 那么就处理用UserResponseConverter 类处理
// 我们稍后再看这个类
//如果不为这个处理类那么返回空交给另一个转化器处理
if (type == Bitmap.class)
return new UserResponseConverter(type);
return null;
} private static BitMapCoverterFactory bitMapCoverterFactory; static BitMapCoverterFactory create() { if (bitMapCoverterFactory == null) {
bitMapCoverterFactory = new BitMapCoverterFactory();
}
return bitMapCoverterFactory;
} private BitMapCoverterFactory() { }
}- 编写处理逻辑类 这个类必须实现Converter
//返回处理结果
@Override
public T convert(ResponseBody responseBody) throws IOException {
return null ;
}
来结合上面的代码看下
public static class UserResponseConverter<T> implements Converter<ResponseBody, T> {
private Type type;
public UserResponseConverter(Type type) {
this.type = type;
}
@Override
public T convert(ResponseBody responseBody) throws IOException {
byte[] bytes = responseBody.bytes();
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
return (T) bitmap;
}
}
最终代码: //注解大家可以不用看懂 如果想了解的话注解的使用和自己写一个框架
//用注解完成布局填充
@FmyContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
//用注解 完成实例化
@FmyViewView(R.id.iv)
ImageView iv;
public static class UserResponseConverter<T> implements Converter<ResponseBody, T> {
private Type type;
public UserResponseConverter(Type type) {
this.type = type;
}
@Override
public T convert(ResponseBody responseBody) throws IOException {
byte[] bytes = responseBody.bytes();
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
return (T) bitmap;
}
}
static class BitMapCoverterFactory extends Converter.Factory {
@Override
//方法为网络调用后 使用
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
//如果出类型为Bitmap 那么就处理用UserResponseConverter 类处理
// 我们稍后再看这个类
//如果不为这个处理类那么返回空交给另一个转化器处理
if (type == Bitmap.class)
return new UserResponseConverter(type);
return null;
}
private static BitMapCoverterFactory bitMapCoverterFactory;
static BitMapCoverterFactory create() {
if (bitMapCoverterFactory == null) {
bitMapCoverterFactory = new BitMapCoverterFactory();
}
return bitMapCoverterFactory;
}
private BitMapCoverterFactory() {
}
}
private Retrofit retrofit;
private TestConn testConn;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//初始化注解
FmyViewInject.inject(this);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://www.baidu.com/")
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(BitMapCoverterFactory.create())
.build();
testConn = retrofit.create(TestConn.class);
testConn.getString().enqueue(new Callback<Bitmap>() {
@Override
public void onResponse(Call<Bitmap> call, Response<Bitmap> response) {
iv.setImageBitmap(response.body());
}
@Override
public void onFailure(Call<Bitmap> call, Throwable t) {
}
});
}
interface TestConn {
@GET("https://ss0.baidu.com/73F1bjeh1BF3odCf/it/u=2537069448,2929136489&fm=85&s=85B8ED321DD844CA4EED10DE000070B1")
Call<Bitmap> getString();
}
}
心得
其实如果你不是用转化器也可以的
处理类型为ResponseBody也是可以的 当网络访问结束后自行处理即可
interface TestConn { @GET("https://ss0.baidu.com/73F1bjeh1BF3odCf/it/u=2537069448,2929136489&fm=85&s=85B8ED321DD844CA4EED10DE000070B1")
Call<ResponseBody> getString();
}
自定义Retrofit转化器Converter的更多相关文章
- SpringBoot(十七):SpringBoot2.1.1数据类型转化器Converter
什么场景下需要使用类型化器Converter? springboot2.1.1在做Restful Api开发过程中往往希望接口直接接收date类型参数,但是默认不加设置是不支持的,会抛出异常:系统是希 ...
- Spring MVC请求参数绑定 自定义类型转化 和获取原声带额servlet request response信息
首先还在我们的框架的基础上建立文件 在domian下建立Account实体类 import org.springframework.stereotype.Controller; import org. ...
- flask之web网关、三件套、配置、路由(参数、转化器及自定义转化器)、cbv、模板语言、session
目录 1.wsgiref.py 2.werzeug.py 3.三件套 4.配置文件 5.路由本质 6.cbv.py 7.路由转化器 8.自定义转化器 9.模板语言 10.session原理 11.te ...
- flask中的endpoint、自定义转化器、与djnago中session区别、利用装饰器实现登录认证
flask路由中的endpoint 与自定义转化器 ''' endpoint主要用于 反向解析, 例如:login函数中配的路由是/login,其中endpoint='lg' 则在其他函数,可以用 u ...
- jQuery源码分析系列(36) : Ajax - 类型转化器
什么是类型转化器? jQuery支持不同格式的数据返回形式,比如dataType为 xml, json,jsonp,script, or html 但是浏览器的XMLHttpRequest对象对数据的 ...
- SpringMVC09异常处理和类型转化器
public class User { private String name; private Integer age; public String getName() { return name; ...
- struts2 自定义类型转化 第三弹
1.Struts2的类型转化,对于8种原生数据类型以及Date,String等常见类型,Struts2可以使用内建的类型转化器实现自动转化:但对于自定义的对象类型来说,就需要我们自己指定类型转化的的方 ...
- 《精通C#》自定义类型转化-扩展方法-匿名类型-指针类型(11.3-11.6)
1.类型转化在C#中有很多,常用的是int类型转string等,这些都有微软给我们定义好的,我们需要的时候直接调用就是了,这是值类型中的转化,有时候我们还会需要类类型(包括结构struct)的转化,还 ...
- Java类加载机制及自定义加载器
转载:https://www.cnblogs.com/gdpuzxs/p/7044963.html Java类加载机制及自定义加载器 一:ClassLoader类加载器,主要的作用是将class文件加 ...
随机推荐
- python操作mongodb
# python操作mongodb # 首先,引入第三方模块pymongo,该模块是python用来操作mongodb的 import pymongo # 第二步,设置ip地址,以及表格名称,表格名字 ...
- php+MySql实现登录系统与输出浏览者信息功能
这篇文章主要介绍了php+MySql实现登录系统与输出浏览者信息功能 的相关资料,需要的朋友可以参考下 本系统,与之前在<ASP 连接Access数据库的登陆系统>(点击打开链接)一文 ...
- 关于Goldwell平台推出赠金及手数奖励
关于Goldwell平台推出赠金及手数奖励 Goldwell平台是一家拥有30多年现货黄金经验平台,平台位于柬埔寨金边,是一家国际衍生品的经纪公司.Goldwell平台它对柬埔寨金融市场和客户绝对的承 ...
- Leetcode 804. Unique Morse Code Words 莫尔斯电码重复问题
参考:https://blog.csdn.net/yuweiming70/article/details/79684433 题目描述: International Morse Code defines ...
- poj 1046 ——Color Me Less
提交地址:http://poj.org/problem?id=1046 Color Me Less Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- boot.img格式文件拆解实例结构解析
以msm8226为例,讲解android源码编译生成boot.img的结构.boot.img包括boot.img header.kernel以及ramdisk文件系统.下面是对boot.img的结构进 ...
- [HNOI2009]图的同构
Description 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和 ...
- ●BZOJ 2820 YY的GCD
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2820 题解: 莫比乌斯反演 先看看这个题:HDU 1695 GCD(本题简化版) HDU 1 ...
- 【NOIP 2017】宝藏
Description 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋 ...
- 【SPOJ839】Optimal Marks 网络流
You are given an undirected graph G(V, E). Each vertex has a mark which is an integer from the range ...