Okhttp简单辅助类与debug注意事项

先贴代码(代码不全,仅供参考)

import android.os.Handler;
import android.os.Looper;
import android.support.v4.util.ArrayMap;

import com.ztesoft.zsmart.oss.foa.net.http.callback.FOACallBack;
import com.ztesoft.zsmart.oss.foa.net.http.cookie.CookieJarImpl;
import com.ztesoft.zsmart.oss.foa.net.http.cookie.store.CookieStore;
import com.ztesoft.zsmart.oss.foa.net.http.cookie.store.HasCookieStore;
import com.ztesoft.zsmart.oss.foa.net.http.cookie.store.MemoryCookieStore;
import com.ztesoft.zsmart.oss.foa.net.http.exception.Exceptions;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.CookieJar;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
* Created by boann on 2016/5/9.
*/
public class OkHttpUtils {
public static final String REQUEST_STRING_KEY_NAME = "mobile_request_attribute"; //json参数的key
public static final int CONNECTION_TIME_OUT_DEFAULT = 20000; //默认连接超时时间
public static final int READ_TIME_OUT_DEFAULT = 60000; //默认读取超时时间
public static final int WRITE_TIME_OUT_DEFAULT = 60000; //默认写超时时间
private static OkHttpUtils mInstance; //单例模式
private OkHttpClient mOkHttpClient; //
private Handler mDelivery; //用于发送结果给UI线程

/**
* 构造函数
* @param okHttpClient
*/
public OkHttpUtils(OkHttpClient okHttpClient) {
if (okHttpClient == null) {
OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
//cookie enabled
okHttpClientBuilder.cookieJar(new CookieJarImpl(new MemoryCookieStore()));
okHttpClientBuilder.sslSocketFactory(HttpsUtils.getSslSocketFactory());
okHttpClientBuilder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});

mOkHttpClient = okHttpClientBuilder.build();
} else {
mOkHttpClient = okHttpClient;
}

init();
}

/**
* 取得handler
*/
private void init() {
mDelivery = new Handler(Looper.getMainLooper());
}

/**
* 单例模式实现
* @param okHttpClient
* @return
*/
public static OkHttpUtils getInstance(OkHttpClient okHttpClient) {
if (mInstance == null) {
synchronized (OkHttpUtils.class) {
if (mInstance == null) {
mInstance = new OkHttpUtils(okHttpClient);
}
}
}
return mInstance;
}

/**
* 单例模式实现
* @return
*/
public static OkHttpUtils getInstance() {
if (mInstance == null) {
synchronized (OkHttpUtils.class) {
if (mInstance == null) {
mInstance = new OkHttpUtils(null);
}
}
}
return mInstance;
}

/**
* 返回handler
* @return
*/
private Handler getDelivery() {
return mDelivery;
}

/**
* 设置连接,读取,写超时时间
* @return
*/
public OkHttpClient getOkHttpClient() {
mOkHttpClient.newBuilder().connectTimeout(CONNECTION_TIME_OUT_DEFAULT, TimeUnit.MILLISECONDS)
.readTimeout(READ_TIME_OUT_DEFAULT, TimeUnit.MILLISECONDS)
.writeTimeout(READ_TIME_OUT_DEFAULT, TimeUnit.MICROSECONDS)
.build();
return mOkHttpClient;
}

/**
*
* @return
*/
public CookieStore getCookieStore() {
final CookieJar cookieJar = mOkHttpClient.cookieJar();
if (cookieJar == null) {
Exceptions.illegalArgument("you should invoked okHttpClientBuilder.cookieJar() to set a cookieJar.");
}
if (cookieJar instanceof HasCookieStore) {
return ((HasCookieStore) cookieJar).getCookieStore();
} else {
return null;
}
}

/**
* 取消请求
* @param tag
*/
public void cancelTag(Object tag) {
for (Call call : mOkHttpClient.dispatcher().queuedCalls()) {
if (tag.equals(call.request().tag())) {
call.cancel();
}
}
for (Call call : mOkHttpClient.dispatcher().runningCalls()) {
if (tag.equals(call.request().tag())) {
call.cancel();
}
}
}

/**
* 发送失败结果
* @param call
* @param e
* @param callback
*/
private void sendFailResultCallback(final Call call, final Response response, final Exception e, final FOACallBack callback)
{
if (callback == null) return;

mDelivery.post(new Runnable()
{
@Override
public void run()
{
callback.onError(call, response, e);
callback.onAfter();
}
});
}

/**
* 发送成功结果
* @param object
* @param callback
*/
private void sendSuccessResultCallback(final Object object, final FOACallBack callback)
{
if (callback == null) return;
mDelivery.post(new Runnable()
{
@Override
public void run()
{
callback.onResponse(object);
callback.onAfter();
}
});
}

/**
* 打包请求
* @param tag
* @param url
* @param requestString
* @param files
* @return
*/
private static Request getRequest(Object tag, String url, String requestString, ArrayMap<String, ArrayList<String>> files) {
MultipartBody.Builder mBuilder = new MultipartBody.Builder();
mBuilder.setType(MultipartBody.FORM);
mBuilder.addFormDataPart(REQUEST_STRING_KEY_NAME, requestString);
if (files != null) {
int count = files.size();
for (int i = 0; i < count; i++){
ArrayList<String> filePaths = files.valueAt(i);
for (int j = 0; j < filePaths.size(); j++) {
File file = new File(filePaths.get(j));
if (file.exists()) {
mBuilder.addFormDataPart(files.keyAt(i), files.keyAt(i), RequestBody.create(MultipartBody.FORM, new File(filePaths.get(j))));
}
}
}
}
return new Request.Builder()
.tag(tag)
.url(url)
.post(mBuilder.build())
.build();
}

/**
* 执行请求
* @param call
* @param foaCallBack
*/
private void foaCall(Call call, FOACallBack foaCallBack) {
if (foaCallBack == null) {
foaCallBack = DEFAULT_CALLBACK;
}
final FOACallBack finalCallBack = foaCallBack;
foaCallBack.onBefore(call.request());
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
sendFailResultCallback(call, null, e, finalCallBack);
}

@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.code() >= 400 && response.code() <= 599) {
try {
sendFailResultCallback(call, response, new RuntimeException(response.body().string()), finalCallBack);
} catch (IOException e) {
e.printStackTrace();
}
return;
}

try {
Object o = finalCallBack.parseNetworkResponse(response);
sendSuccessResultCallback(o, finalCallBack);
} catch (Exception e) {
sendFailResultCallback(call, response, e, finalCallBack);
}
}
});
}

/**
* 异步进行带图片的请求
* @param tag
* @param url
* @param requestString
* @param files
* @param callback
*/
public static void postWithFilesAsyn(Object tag, String url, String requestString, ArrayMap<String, ArrayList<String>> files, FOACallBack callback) {
Call call = getInstance().getOkHttpClient().newCall(getRequest(tag, url, requestString, files));
getInstance().foaCall(call, callback);
}

/**
* 同步进行带图片的请求
* @param tag
* @param url
* @param requestString
* @param files
* @return
*/
public static String postWithFilesSyn(Object tag, String url, String requestString, ArrayMap<String, ArrayList<String>> files) throws Exception{
return OkHttpUtils.getInstance().getOkHttpClient().newCall(getRequest(tag, url, requestString, files)).execute().body().string();
}

/**
* 异步进行不带图片的请求
* @param tag
* @param url
* @param requestString
* @param callback 自定义callback
*/
public static void postAsyn(Object tag, String url, String requestString, FOACallBack callback) {
Call call = getInstance().getOkHttpClient().newCall(getRequest(tag, url, requestString, null));
getInstance().foaCall(call, callback);
}

/**
* 同步进行不带图片的请求
* @param tag
* @param url
* @param requestString
* @return
*/
public static String postSyn(Object tag, String url, String requestString) throws Exception {
return OkHttpUtils.getInstance().getOkHttpClient().newCall(getRequest(tag, url, requestString, null)).execute().body().string();
}

/**
* 默认的callback
*/
public static FOACallBack DEFAULT_CALLBACK = new FOACallBack() {
@Override
public void onBefore(Request request) {
}

@Override
public void onAfter() {
}

@Override
public void inProgress(float progress) {
}

@Override
public Object parseNetworkResponse(Response response) throws Exception {
return null;
}

@Override
public void onError(Call call, Response response, Exception e) {
}

@Override
public void onResponse(Object response) {

}
};
}

接下来是debug时的大坑,困扰了一天

主要代码如下

String requestStr = getRequest(locationBeans).toString();
MultipartBody.Builder mBuilder = new MultipartBody.Builder();
mBuilder.setType(MultipartBody.FORM);
mBuilder.addFormDataPart("mobile_request_attribute", requestStr);
Request request = new Request.Builder()
.url(BasicUtils.getServerUrl(this))
.post(mBuilder.build())
.build();
try {
Response response = OkHttpUtils.getInstance().getOkHttpClient().newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
System.out.println("Server: " + response.header("Server"));
System.out.println("Date: " + response.header("Date"));
System.out.println("Vary: " + response.headers("Vary"));
System.out.println(response.body().string());
} catch (Exception e) {
e.printStackTrace();
}

运行到response.body().string()一步时抛异常,java.lang.IllegalStateException: closed

查阅各种资料大致意思是The IllegalStateException arises because the HttpConnection seems to be closed when trying to use it. Could it be because you are calling twice the method response.body()?

就是说调用response.body().string()的时候数据流已经关闭了,再次调用就是提示已经closed,

检查代码发现,其他的地方并没有调用过response.body().string(),而且是调试的时候有,后来发现是在debug的时候添加了Watchs,就是代码的监视,这里会调用一次response.body().string()。

后面需要注意,代码调试的时候表达式的监视有时候会影响代码的运行。

引以为戒。

转载于:https://www.cnblogs.com/boann/p/5479201.html

Okhttp 使用与debug时留的大坑相关推荐

  1. Debug时含有的子元素,在代码里获取不到的问题

    比如,Debug时如下图展示: 我想要获取的是:ansList.get(i).getComponent().getConnectorId() debug时明明有这个元素,但是当我写出来的时候却发现:a ...

  2. 解决eclipse Run启动或Debug时Console控制台不自动弹出问题

    解决eclipse Run启动或Debug时Console控制台不自动弹出问题 参考文章: (1)解决eclipse Run启动或Debug时Console控制台不自动弹出问题 (2)https:// ...

  3. android 在debug的时候不会出现闪退问题 在debug时无法重现bug 的可能原因

    application的运行的时候很明显出现了报错闪退的问题,但是一旦自己debug的时候,这个问题就不能重现,就是所谓的代码成精的问题,这个时候常常的原因是代码中有一部分"同步的" ...

  4. eclipse调试debug时出现source not found

    eclipse调试debug时出现source not found 在代码中设置了断点,程序调试过程中可以继续运行使用断点,但是看不见程序走到哪了,debug页面出现source not found, ...

  5. ideadebug热更新_Spring Boot 在IDEA中debug时的hot deployment(热部署)

    因为Spring Boot的项目一般会打包成jar发布, 在开发阶段debug时, 不能像传统的web项目那样, 选择exploded resources进行debug, 也没有热更新按钮, 如果每次 ...

  6. B 附录 Idea debug时的问题 Skipped breakpoint at ...

    1.问题描述 在Idea 中debug,发现属性莫名其妙赋值了,在所有的赋值语句打上断点也没有用,偶然发现debug时出现 Skipped breakpoint at ... because it h ...

  7. 解决Xcode在debug时不在断点处停止的方法<转>

    解决Xcode在debug时不在断点处停止的方法<转> 参考文章: (1)解决Xcode在debug时不在断点处停止的方法<转> (2)https://www.cnblogs. ...

  8. Idea在debug时打上断点没有用 Skipped breakpoint at ... because it happened inside debugger evaluation

    问题: 最近项目上调试多线程bug时发现奇怪问题:用Idea打上条件断点debug时没有用.直接跳过并提示:Skipped breakpoint at ... because it happened ...

  9. vscode pytorch在debug时遇到问题:Error in `python‘: double free or corruption (prev)

    问题描述:在做一个深度学习计算机视觉的项目时,直接clone下来的代码可以在vscode里正常运行,但是debug时出现error,报错信息为: *** Error in `python': doub ...

最新文章

  1. flexbox布局的兼容性
  2. 分享:手把手教你如何免费且光荣地使用正版IntelliJ IDEA
  3. Scrapy框架items数据建模、翻页请求、requests对象请求、meta参数的使用
  4. 文件输入输出和string流
  5. java文件拷贝_Java实现文件拷贝的4种方法
  6. Java从入门到精通——数据库篇Mongo DB GridFS文件系统
  7. 蜂鸟开发板 linux,蜂鸟E203系列——Linux下运行hello world例程
  8. phpcms ajax 调取文章内容,Phpcms V9列表页使用GET标签调用指定文章内容的方法
  9. 用C#实现屏幕键盘!
  10. QList、QVector、QMap容器类
  11. 同步现象 心理学_男生是不是更容易从失恋中走出来?心理学:失恋后悲伤,男女不同...
  12. 常州模拟赛d7t2 数组
  13. [JAVA]预面试笔记
  14. 携程分销联盟-旅游度假接口实现1
  15. Swashbuckle Swagger组件扩展
  16. Java学习记录 课程来自黑马刘意(风清扬)19年版
  17. Java配置环境变量32位
  18. java打印sscil码_2018最新发布 |SSCI收录语言学学科期刊目录
  19. 为什么用交叉线而不是直通线连接相同的设备
  20. 如何使用Git上传本地项目到github?(mac版)

热门文章

  1. RelativeLayout不能居中的解决的方法
  2. 第8章3节《MonkeyRunner源码剖析》 5
  3. CSS before / after伪元素
  4. laravel Transformers中修改data键
  5. python爬虫之初恋 selenium
  6. 动态的根据一个资源名获得到对应的资源id
  7. 我对javascript对象的理解
  8. spring bean scope作用域及多线程安全问题场景分析
  9. 火狐访问HTTPS网站显示连接不安全的解决方法
  10. Spring中集成ActiveRecordPlugin数据操作插件