您的位置:首页 > 理论基础 > 计算机网络

okHttp的请求超时以后,连续发送5次请求后就不能再发送请求了

2016-05-16 10:30 633 查看
项目之中遇到了OkHttp 请求超时以后就不能发送请求了,

解决办法是在onFail的里面再添加一下HttpClient.mOkHttpClient = new OkHttpClient(); 

public void onFailure(Call call, IOException e) {

                HttpClient.mOkHttpClient = new OkHttpClient();

                callback.onFailure(call,e);

            }

package com.wbm.app.business.net;

import android.util.Log;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.wbm.app.commons.Result;
import com.wbm.app.commons.ResultList;
import com.wbm.app.utils.DateUtil;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
* Created by shiang on 16-1-21.
*/
public class BopHttpClient {
private final static String APP_KEY ="500mi-cashier";
public final static String EMPTY_SESSION="EMPTY_SESSION";

/**
* 调用java后端服务
* @param domain
* @param method
* @param map
* @param callback
*/
public static void callHttpMethod(String domain,String method,String session, Map<String,String> map, final Callback callback){

FormBody.Builder bodyBuilder = new FormBody.Builder()
.add("method", method).add("session",session)
.add("timestamp", DateUtil.formateDate(new Date())).add("app_key",APP_KEY)
.add("format","json");

if(map!=null && map.size()>0){
for(Map.Entry<String,String> entry:map.entrySet()){
bodyBuilder.add(entry.getKey(),entry.getValue());
}
}

FormBody requestBody = bodyBuilder.build();

//创建一个Request
final Request request = new Request.Builder()
.url("http://"+domain+":8080/gateway/api").post(requestBody)
.build();

Call call = HttpClient.mOkHttpClient.newCall(request);

call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//TODO
HttpClient.mOkHttpClient = new OkHttpClient();
callback.onFailure(call,e);
}

@Override
public void onResponse(Call call, Response response) throws IOException {
//TODO
callback.onResponse(call,response);

}
});
}

public static <K,T extends Result<K>> void callHttpMethod4Result(String domain,String method,String session, Map<String,String> map, final WrapCallback<T> callback,final K k){
callHttpMethod(domain,method, session,map,new Callback() {
@Override
public void onFailure(Call call, IOException e) {
HttpClient.mOkHttpClient = new OkHttpClient();

callback.onFailure(call,e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
String responseStr = response.body().string();
if (response.code() >= 200 && response.code() < 300) {
Result<K> responseObject = JSON.parseObject(responseStr, new TypeReference<Result<K>>() {
});
if (responseObject.getData() != null) {
K valueObject = null;
Class<?> targetType= k.getClass();
if (targetType == String.class) {
valueObject =  (K)responseObject.getData().toString();
}
else if ((targetType == Integer.class) || (targetType == Integer.TYPE))
valueObject =  (K)Integer.valueOf(responseObject.getData().toString());
else if ((targetType == Byte.class) || (targetType == Byte.TYPE))
valueObject =  (K)Byte.valueOf(responseObject.getData().toString());
else if ((targetType == Double.class) || (targetType == Double.TYPE))
valueObject =  (K)Double.valueOf(responseObject.getData().toString());
else if ((targetType == Float.class) || (targetType == Float.TYPE))
valueObject =  (K)Float.valueOf(responseObject.getData().toString());
else if ((targetType == Long.class) || (targetType == Long.TYPE))
valueObject =  (K)Long.valueOf(responseObject.getData().toString());
else if ((targetType == Short.class) || (targetType == Short.TYPE))
valueObject =  (K)Short.valueOf(responseObject.getData().toString());
else if (targetType == BigDecimal.class )
valueObject =  (K)new BigDecimal(responseObject.getData().toString());
else{
valueObject = (K) JSONObject.toJavaObject((JSONObject) responseObject.getData(), k.getClass());
}
responseObject.setData(valueObject);
}
callback.onResponse(call, (T) responseObject);
} else {
//                        Result<K> responseObject = new Result<K>();
//                        responseObject.setError(ErrorCodeConstants.SYSTEMERROR_999999.getErrorCode(), ErrorCodeConstants.SYSTEMERROR_999999.getErrorName(), ErrorCodeConstants.SYSTEMERROR_999999.getErrorMessage());
//                        callback.onResponse(call, (T) responseObject);
onFailure(call,new IOException());
}
}catch (Throwable e){
//                    throw e;
onFailure(call,new IOException(e));
}

}
});
}

public static <K,T extends ResultList<K>> void callHttpMethod4ResultList(String domain,String method,String session, Map<String,String> map, final WrapCallback<T> callback,final K k){
callHttpMethod(domain,method, session,map,new Callback() {
@Override
public void onFailure(Call call, IOException e) {
<strong><span style="color:#33cc00;"> </span><span style="color:#ff6666;"> HttpClient.mOkHttpClient = new OkHttpClient();</span></strong>

callback.onFailure(call,e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
String responseStr = response.body().string();
if (response.code() >= 200 && response.code() < 300) {
ResultList<K> responseObject = JSON.parseObject(responseStr, new TypeReference<ResultList<K>>() {
});
if (responseObject.getDatalist() != null) {
String valueString = JSON.toJSONString(responseObject.getDatalist());
List<K> values = (List<K>) JSON.parseArray(valueString, k.getClass());
responseObject.setDatalist(values);
}
callback.onResponse(call, (T) responseObject);
} else {
onFailure(call,new IOException());
}
}catch (Throwable e){
onFailure(call,new IOException(e));
}
}
});
}

}


我觉得的我们团队的Dorme是非常棒的,我的思路是想它怎么会5次以后就不能访问了,我一直以为是okHttp的问题

Dorme的思路是考虑怎么我们之前的new OkHttpClient()没有执行,然后在哪里增加了一个记录发现果然没有执行,那么就增加了一个断电看看到底怎么执行的最后发现调用的地方原来不是之前的地方是别的地方就是下面的这个onFailure里面。

我需要把这样的思路给get了。感谢Dorme。

我觉得的我们团队的Dorme是非常棒的,我的思路是想它怎么会5次以后就不能访问了,我一直以为是okHttp的问题

Dorme的思路是考虑怎么我们之前的new OkHttpClient()没有执行,然后在哪里增加了一个记录发现果然没有执行,那么就增加了一个断电看看到底怎么执行的最后发现调用的地方原来不是之前的地方是别的地方就是下面的这个onFailure里面。

我需要把这样的思路给get了。感谢Dorme。

反思一下:其实我是过分的依赖网络了,因为我相信我遇到的问题别人一定也遇到了,所以我才没有深入的去debug,而是去上网查询,下一次再遇到这样给的事情,首先自己先debug,然后看看能不能在网上找到答案,一小段时间没有找到的话自己再debug。加油。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: