总结一下,最近在整改APP,把H5的ajax全部换成了安卓的OKHTTP.但是会经常卡死,因为是不同语言,有js 有java,所以没法 debug 看,只能 alter 和debug 混合来,一次无意中发现了一个问题,拿出来一块看看。
下面这段 看起来没问题吧。
/**
* post 异步请求 请求加密,请求的数据在前段已经加好密了
* @param json
* @throws JSONException
*/
private void postFunctionReqjiami(JSONArray json) throws JSONException {
if(resultMsg.length()>0){
resultMsg.remove(0);
}
JSONArray paramJSONArray= json.getJSONArray(1);
String url=paramJSONArray.optString(4).trim();
String paramValues=paramJSONArray.getString(5);
//String转JSONObject
JSONObject result = new JSONObject(paramValues);
//取数据
String encryptedReq= (String) result.get("encryptedReq");
// okHttpClient = new OkHttpClient().newBuilder()
// .connectTimeout(50000, TimeUnit.MILLISECONDS)
// .readTimeout(50000, TimeUnit.MILLISECONDS)
// .sslSocketFactory(SSLHelper.getSSLCertifcation(NetConfig.getContextData()), new HttpsUtil.UnSafeTrustManager())
// .hostnameVerifier(new HttpsUtil.UnSafeHostnameVerifier())//此处设置忽略掉域名校验
// .build();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("encryptedReq",encryptedReq);//传递键值对参数
Request request = new Request.Builder()//创建Request 对象。
.url(url)
.post(formBody.build())//传递请求体
.header("User-Agent", "OkHttp Headers.java")
.addHeader("userId", UserConfig.getUserData())
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if(e instanceof SocketTimeoutException && serversLoadTimes < maxLoadTimes) // 如果超时并未超过指定次数,则重新连接
{
serversLoadTimes++;
okHttpClient.newCall(call.request()).enqueue(this);
}else {
e.printStackTrace();
JSUtil.execCallback(webview, callbackId, "异常", JSUtil.ERROR, false);
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
resultMsg.put(response.body().string());
String b=response.message();
JSUtil.execCallback(webview, callbackId, resultMsg, JSUtil.OK, false);
}
});
}
看这里,,这里我在每次调用这个
resultMsg json数组赋值的时候,都会在方法最开始的地方把它的内容清空,我只让它也只能让它有一个数组元素。但是一次我看到它有两个元素,于是当它把两个元素返回给JS的时候,js认不出来了,最开始的地方 resultMsg.remove(0);
这个方法没有清掉吗???
我只好把
resultMsg.put(response.body().string());
修改成
resultMsg.put(0,response.body().string());
看会不会出现奇怪的问题。