Retrofit2 学习笔记(二)
2016-07-28 18:10
483 查看
一 如何发送一个纯文本作为请求体
方法一使用 Scalars Converter
方法二使用 ResponseBody 类
二 失败重连
或者
方法一使用 Scalars Converter
方法二使用 ResponseBody 类
二 失败重连
一. 如何发送一个纯文本作为请求体
方法一:使用 Scalars Converter
Scalars Converter 可以用于序列化的 text/plain 请求compile 'com.squareup.retrofit2:converter-scalars:2.1.0'
Retrofit retrofit = new Retrofit.Builder() .addConverterFactory(ScalarsConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .baseUrl("https://your.base.url/") .build();
public interface ScalarService { @POST("path") Call<String> getStringScalar(@Body String body); }
String body = "plain text request body"; Call<String> call = service.getStringScalar(body); Response<String> response = call.execute(); String value = response.body();
方法二:使用 ResponseBody 类
public interface ScalarService { @POST("path") Call<ResponseBody> getStringRequestBody(@Body RequestBody body); }
String text = "plain text request body"; RequestBody body = RequestBody.create(MediaType.parse("text/plain"), text); Call<ResponseBody> call = service.getStringRequestBody(body); Response<ResponseBody> response = call.execute(); String value = response.body().string();
二. 失败重连
使用call.clone().eqnqueue(),同时可以控制
retry number
public abstract class CallbackWithRetry<T> implements Callback<T> { private static final int TOTAL_RETRIES = 3; private static final String TAG = CallbackWithRetry.class.getSimpleName(); private final Call<T> call; private int retryCount = 0; public CallbackWithRetry(Call<T> call) { this.call = call; } @Override public void onFailure(Throwable t) { Log.e(TAG, t.getLocalizedMessage()); if (retryCount++ < TOTAL_RETRIES) { Log.v(TAG, "Retrying... (" + retryCount + " out of " + TOTAL_RETRIES + ")"); retry(); } } private void retry() { call.clone().enqueue(this); } } serviceCall.enqueue(new CallbackWithRetry<List<Album>>(serviceCall) { @Override public void onResponse(Response<List<Album>> response) { ... } });
或者
public abstract class BackoffCallback<T> implements Callback<T> { private static final int RETRY_COUNT = 3; /** * Base retry delay for exponential backoff, in Milliseconds */ private static final double RETRY_DELAY = 300; private int retryCount = 0; @Override public void onFailure(final Call<T> call, Throwable t) { retryCount++; if (retryCount <= RETRY_COUNT) { int expDelay = (int) (RETRY_DELAY * Math.pow(2, Math.max(0, retryCount - 1))); new Handler().postDelayed(new Runnable() { @Override public void run() { retry(call); } }, expDelay); } else { onFailedAfterRetry(t); } } private void retry(Call<T> call) { call.clone().enqueue(this); } public abstract void onFailedAfterRetry(Throwable t); }
相关文章推荐
- [IOS开发]CABasicAnimation animationWithKeyPath有哪些值
- 使用telnet发送邮件
- 【使用工具和软件汇总】
- Cordova/CDVViewController.h file not found 解决办法
- SQL联合索引 与 单一列的索引
- linux下的五种IO模型
- Mac终端的ruby和pods安装和使用(超干货)
- linux 下删除文件夹(文件夹不为空时)
- h264 编码 0延时
- 监控服务器负载脚本
- 沉浸式状态栏(TranslucentBars)
- 深入探究Android的WebView下载网络文件的盗链问题
- C# 如何调用VB6.0编写的dll
- 在Windows 8.1下 安装基于Python 3.5.2的 Scrapy 框架 !已安装完成
- 神经网络基础算法
- Linux 常用命令总结
- NSString属性什么时候用copy,什么时候用strong?
- 从零开始学_JavaScript_系列(26)——dojo的aspect方法
- 本地仓库 同步到 bitbucket 远程git库
- W3C近期要闻汇总