Retrofit2.0 使用归纳和 JSONObject Conveter
2016-02-24 16:09
549 查看
前面的话
Retrofit由于其相比于其他http开源库具有更加简单和出色的性能,从而成为Android端最流行的Http客户端库之一。存在的缺点是在1.X版本上没有取消正在进行中的事务的方法。
从2015 年开始,Retrofit 2.0 虽说一直是 Beta 版本迭代,相对于1.9来说,改动还是相当的大的。
特别提示:
由于2.0的版本中, retrofit:2.0.0-beta2 和 beta3 以后的版本改变较大。包括包名和引用方式,如果要升级的同学请慎重。改变之处:
OKHttpClient和OKHttpClient3的不同com.squareup.retrofit和com.squareup.retrofit2的不同
拦截器添加方法的不同
内部结构和使用方式的不同等
添加Gradle依赖
retrofit:2.0.0-beta2
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2' // retrofit compile 'com.google.code.gson:gson:2.5' // gson compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' // gson convertor with retrofit compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2' // rxjava extension with retrofit compile 'com.squareup.okhttp:logging-interceptor:2.7.0'
retrofit:2.0.0-beta4
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' // retrofit compile 'com.google.code.gson:gson:2.5' // gson compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4' compile 'com.squareup.okhttp3:logging-interceptor:3.1.2' compile 'com.squareup.okhttp3:okhttp:3.1.2'
创建 Retrofit 常规实例
public static Retrofit initRetrofit(){ OkHttpClient httpClient = new OkHttpClient(); if (BuildConfig.DEBUG) { HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); httpClient = new OkHttpClient.Builder().addInterceptor(logging).build(); } Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") .create();//使用 gson coverter,统一日期请求格式 return new Retrofit.Builder() .baseUrl(BaseUtil.getGlivecApiUrl()) .addConverterFactory(GsonConverterFactory.create(gson)) .client(httpClient) .build(); } /** * 创建 RetrofitManage 服务 * * @return ApiService */ public static ApiService createApiService() { return initRetrofit().create(ApiService.class); }
拦截器:
拦截器是应用在不同场合下需要的,比如打印日志,请求添加头文件。//注意此处和 beta3 之前的版本写法不同: OkHttpClient client =new OkHttpClient.Builder().addInterceptor.(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request original = chain.request(); // Customize the request header Request request = original.newBuilder() .header("Accept", "application/json") .header("Authorization", "auth-token") .method(original.method(), original.body()) .build(); Response response = chain.proceed(request); // Customize or return the response return response; } });
转换器
目前 beta-4 开始支持以下几种 converter:Gson: com.squareup.retrofit2:converter-gson Jackson: com.squareup.retrofit2:converter-jackson Moshi: com.squareup.retrofit2:converter-moshi Protobuf: com.squareup.retrofit2:converter-protobuf Wire: com.squareup.retrofit2:converter-wire Simple XML: com.squareup.retrofit2:converter-simplexml Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars
同步和异步请求
和1.9不同在2.0 版本中,请求只需要一种写法import retrofit.Call /*Retrofit 2.0*/ public interfase ApiService{ @POST("/list") Call<Repo> loadRepo(); //支持动态url @POST Call<Repo> loadRepo(@Url String url); }
异步调用
Call<Repo> call = service.loadRepo(); call.enqueue(new Callback<Repo>(){ @Override public void onResponse(Response<Repo> response){ //从response.body()中获取结果 } @Override public void onFailure(Throwable t){ } });
同步调用
Call<Repo> call = service.loadRepo(); Repo repo = call.excute();
在Android中不能在主线程中调用,否则会抛出NetworkOnMainThreadException
取消请求
服务模式变成Call的原因是正在进行中的请求事务可以被取消,只用简单的使用call.cancel()就可以了。call.cancel();
特殊需求:
如果在使用的过程中,不需要Gson以及其他转换器,只是单纯的返回 JSONObject,那这样怎么处理呢?通过阅读源码发现,可以通过自定义转换器的方式操作:
import retrofit.Call /*Retrofit 2.0*/ public interfase ApiService{ @POST("/list") Call<JSONObject> loadRepo(); }
同步操作:
Call<JSONObject> call = service.loadRepo(); Repo repo = call.excute()
异步操作:
Call<JSONObject> call = service.loadRepo(); call.enqueue(new Callback<JSONObject>(){ @Override public void onResponse(Response<JSONObject> response){ //从response.body()中获取结果 } @Override public void onFailure(Throwable t){ } });
这样就完了么?不。
添加自定义Converter
地址:https://github.com/brokge/Retrofit2.0-JSONCoverter
选择相应版本添加到项目中。(Retrofit 2.0 -beta2和Retrofit 2.0-beta4 处理方式不同)
GsonConverterFactory.create(gson)换成
JsonConverterFactory.create()
代码如下:
private static Retrofit initRetrofit() { OkHttpClient httpClient = new OkHttpClient(); if (BuildConfig.DEBUG) { HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); httpClient = new OkHttpClient.Builder().addInterceptor(logging).build(); } return new Retrofit.Builder() .baseUrl(BaseUtil.getApiUrl()) .addConverterFactory(JsonConverterFactory.create()) .client(httpClient) .build(); }
相关文章推荐
- Java IO之对象的序列化、ObjectInputStream和ObjectOutputStream类
- iOS NSUserDefaults setObject forKey,本地化存储,删除字典中的null,空值,本地化的时候,如果value为空值所引起的崩溃
- Swift 与 Objective-C混合编程
- TypeError: ObjectId('') is not JSON serializable
- JSONObject_v3
- Java基础(二):Object、Class、克隆、异常编程
- objective_C 优缺点
- 目标检测“Object Detection Using Generalization and Efficiency Balanced Co-occurrence Features”
- Spring中JDBCTemplate使用queryForObject方法时 ”Incorrect column count: expected 1, actual 5“错误
- Spring中JDBCTemplate中queryForObject()方法的使用
- Objective-C Runtime 运行时之六:拾遗
- 《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言
- Objective-C Runtime 运行时之三:方法与消息
- Objective-C中一些 值得程序员注意的地方(转载)
- Objective-C Runtime 运行时之二:成员变量与属性
- Objective-C Runtime 运行时之一:类与对象
- JAVA_对象一对一关系 ObjectOneToOneRelationship.java
- JAVA_对象一对一关系 ObjectOneToOneRelationship.java
- 《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言
- reduce and each_with_object