我们来看一下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. SpringMVC(八):使用Servlet原生API作为Spring MVC hanlder方法的参数

    在SpringMVC开发中,是有场景需要在Handler方法中直接使用ServletAPI. 在Spring MVC Handler的方法中都支持哪些Servlet API作为参数呢? --Respo ...

  2. JS面向对象特性和值类型与复合类型

      JS面向对象之特性已经值类型与复合类型 一些属性 空对象 空对象也是对象, 只是有存变量的变量名, 没有对象属性 var o ={}; 参数传递 值类型: 函数内外两个变量, 两个数据, 都不相同 ...

  3. javax.el.ELException: Error reading [name] on type [com.news.entity.Topic_$$_javassist_1]异常

    异常如下: 异常分析:从message中可以看出,错误是读取异常,属性是name,路径是com.news.entity.Topic,此错误是使用Hibernate时,由于Hibernate还没有去数据 ...

  4. PHP面向对象-看父类调用子类方法

    大部分面向对象编程语言中,父类是不允许调用子类的方法的,但是PHP中可以 1.父类调用子类方法示例 class A { public function testa() { $this->test ...

  5. [LeetCode] Knight Probability in Chessboard 棋盘上骑士的可能性

    On an NxN chessboard, a knight starts at the r-th row and c-th column and attempts to make exactly K ...

  6. [LeetCode] Longest Uncommon Subsequence II 最长非共同子序列之二

    Given a list of strings, you need to find the longest uncommon subsequence among them. The longest u ...

  7. 百度URL 部分参数

    [Baidu URL的部分参数] 1.Baidu Form表单如下: 2.部分参数解析 wd  查询关键字,就是你要搜索的内容. bs 上一次搜索的词或者内容: rn  搜索结果页每页显示的数目,默认 ...

  8. [POI 2004]SZP

    Description Byteotian 中央情报局 (BIA) 雇佣了许多特工. 他们每个人的工作就是监视另一名特工.Byteasar 国王需要进行一次秘密行动,所以他要挑选尽量多的信得过的特工. ...

  9. [USACO 08DEC]Secret Message

    Description Bessie is leading the cows in an attempt to escape! To do this, the cows are sending sec ...

  10. Blocks

    Description solution 这题和之前做过的一题的一个套路非常类似:把不是更优的决策给去掉,使得序列变得具有单调性,分析这题: 发现如果两个右端点 \(i\),\(j\) 满足 \(su ...