我们来看一下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

教程

  1. 我们先来导入Retrofit的依赖

        compile 'com.squareup.retrofit2:retrofit:2.1.0'
  2. 创建一个类并且继承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() { }
    }
  3. 编写处理逻辑类 这个类必须实现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的更多相关文章

  1. SpringBoot(十七):SpringBoot2.1.1数据类型转化器Converter

    什么场景下需要使用类型化器Converter? springboot2.1.1在做Restful Api开发过程中往往希望接口直接接收date类型参数,但是默认不加设置是不支持的,会抛出异常:系统是希 ...

  2. Spring MVC请求参数绑定 自定义类型转化 和获取原声带额servlet request response信息

    首先还在我们的框架的基础上建立文件 在domian下建立Account实体类 import org.springframework.stereotype.Controller; import org. ...

  3. flask之web网关、三件套、配置、路由(参数、转化器及自定义转化器)、cbv、模板语言、session

    目录 1.wsgiref.py 2.werzeug.py 3.三件套 4.配置文件 5.路由本质 6.cbv.py 7.路由转化器 8.自定义转化器 9.模板语言 10.session原理 11.te ...

  4. flask中的endpoint、自定义转化器、与djnago中session区别、利用装饰器实现登录认证

    flask路由中的endpoint 与自定义转化器 ''' endpoint主要用于 反向解析, 例如:login函数中配的路由是/login,其中endpoint='lg' 则在其他函数,可以用 u ...

  5. jQuery源码分析系列(36) : Ajax - 类型转化器

    什么是类型转化器? jQuery支持不同格式的数据返回形式,比如dataType为 xml, json,jsonp,script, or html 但是浏览器的XMLHttpRequest对象对数据的 ...

  6. SpringMVC09异常处理和类型转化器

    public class User { private String name; private Integer age; public String getName() { return name; ...

  7. struts2 自定义类型转化 第三弹

    1.Struts2的类型转化,对于8种原生数据类型以及Date,String等常见类型,Struts2可以使用内建的类型转化器实现自动转化:但对于自定义的对象类型来说,就需要我们自己指定类型转化的的方 ...

  8. 《精通C#》自定义类型转化-扩展方法-匿名类型-指针类型(11.3-11.6)

    1.类型转化在C#中有很多,常用的是int类型转string等,这些都有微软给我们定义好的,我们需要的时候直接调用就是了,这是值类型中的转化,有时候我们还会需要类类型(包括结构struct)的转化,还 ...

  9. Java类加载机制及自定义加载器

    转载:https://www.cnblogs.com/gdpuzxs/p/7044963.html Java类加载机制及自定义加载器 一:ClassLoader类加载器,主要的作用是将class文件加 ...

随机推荐

  1. Django:(博客系统)使用使用mysql数据->后台管理tag/post/category的配置

    Django后台一般是不需要人为的去开发的,因为django已经通过配置实现哪些模块是后台需要管理,如何排序,列表展示哪些列,列显示名称,是否为空(默认值),过滤条件,分页页数,列表中哪些项可编辑等等 ...

  2. 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 ...

  3. 【PYTHON】递加计数器

    计数本:number.txt 1 2 3 4 主程序:计数器 # Author: Stephen Yuan # 递加计算器 import os # 递加计算器 def calc(): file_siz ...

  4. JS日期格式化转换方法

    1. 将日期转换为指定的格式:比如转换成 年月日时分秒 这种格式:yyyy-MM-dd hh:mm:ss 或者 yyyy-MM-dd.当然是网上的方法,只是总结下. Date.prototype.fo ...

  5. [AHOI 2009]chess 中国象棋

    Description 题库链接 给你一张 \(N\times M\) 的棋盘.要求每行每列最多放两个棋子,问总方案数. \(1\leq N,M\leq 100\) Solution 记 \(f_{i ...

  6. 洛谷P2042 [NOI2005]维护数列

    #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...

  7. [BZOJ]4162: shlw loves matrix II

    Time Limit: 30 Sec  Memory Limit: 128 MB Description 给定矩阵 M,请计算 M^n,并将其中每一个元素对 1000000007 取模输出. Inpu ...

  8. 【NOIP2016】天天爱跑步

    题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 个结点 ...

  9. hdu 4514 并查集+树形dp

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  10. hdu 4638 树状数组 区间内连续区间的个数(尽可能长)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...