自定义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文件加 ...
随机推荐
- Django:(博客系统)使用使用mysql数据->后台管理tag/post/category的配置
Django后台一般是不需要人为的去开发的,因为django已经通过配置实现哪些模块是后台需要管理,如何排序,列表展示哪些列,列显示名称,是否为空(默认值),过滤条件,分页页数,列表中哪些项可编辑等等 ...
- CodeForces 916E Jamie and Tree(树链剖分+LCA)
To your surprise, Jamie is the final boss! Ehehehe. Jamie has given you a tree with n vertices, numb ...
- 【PYTHON】递加计数器
计数本:number.txt 1 2 3 4 主程序:计数器 # Author: Stephen Yuan # 递加计算器 import os # 递加计算器 def calc(): file_siz ...
- JS日期格式化转换方法
1. 将日期转换为指定的格式:比如转换成 年月日时分秒 这种格式:yyyy-MM-dd hh:mm:ss 或者 yyyy-MM-dd.当然是网上的方法,只是总结下. Date.prototype.fo ...
- [AHOI 2009]chess 中国象棋
Description 题库链接 给你一张 \(N\times M\) 的棋盘.要求每行每列最多放两个棋子,问总方案数. \(1\leq N,M\leq 100\) Solution 记 \(f_{i ...
- 洛谷P2042 [NOI2005]维护数列
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...
- [BZOJ]4162: shlw loves matrix II
Time Limit: 30 Sec Memory Limit: 128 MB Description 给定矩阵 M,请计算 M^n,并将其中每一个元素对 1000000007 取模输出. Inpu ...
- 【NOIP2016】天天爱跑步
题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 个结点 ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- hdu 4638 树状数组 区间内连续区间的个数(尽可能长)
Group Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...