【发布时间】:2017-02-07 15:34:51
【问题描述】:
我在同一台服务器上使用了两个嵌套的 volley 请求,但第二个返回错误:
StringRequest strReqUpdate = new StringRequest(Request.Method.GET, versionCheckURL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
initJson = response;
try {
JSONObject root = new JSONObject(initJson);
final long version = root.getLong("latest_update");
long localVersion = prefs.getLong("version", 0);
boolean flag = false;
if(version != localVersion){
flag = true;
}
if(flag == true){
StringRequest strReq = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("json", response);
editor.putLong("version", version);
editor.commit();
parseData(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
String cachedResponse = prefs.getString("json", "");
if (!cachedResponse.equals("")) {
parseData(cachedResponse);
} else {
Toast.makeText(MainActivity.this, getString(R.string.network_error), Toast.LENGTH_LONG).show();
finish();
}
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("key", getResources().getString(R.string.api_key));
return headers;
}
};
strReq.setShouldCache(false);
AppController.getInstance().addToRequestQueue(strReq, Constants.TAG_STRING_REQ);
}
else{
String cachedResponse = prefs.getString("json", "");
if (!cachedResponse.equals("")) {
parseData(cachedResponse);
} else {
Toast.makeText(MainActivity.this, getString(R.string.network_error), Toast.LENGTH_LONG).show();
finish();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
String cachedResponse = prefs.getString("json", "");
if (!cachedResponse.equals("")) {
parseData(cachedResponse);
} else {
Toast.makeText(MainActivity.this, getString(R.string.network_error), Toast.LENGTH_LONG).show();
finish();
}
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("key",getResources().getString(R.string.api_key));
return headers;
}
};
strReqUpdate.setShouldCache(false);
AppController.getInstance().addToRequestQueue(strReqUpdate, Constants.TAG_STRING_REQ);
这里所做的是发出请求以查看我的 JSON 是否有更新,以及是否有开始获取它的请求(如果没有兑现 JSON)。这两个请求都是针对带有 ssl 的 heroku 服务器,但只有第二个请求会引发错误。我认为遇到了一个 ssl 错误,我什至试图从各种帖子中看到过度修改 ssl 握手,但没有任何效果。
第二个被隔离的请求是:
StringRequest strReq = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("json", response);
editor.putLong("version", version);
editor.commit();
parseData(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
String cachedResponse = prefs.getString("json", "");
if (!cachedResponse.equals("")) {
parseData(cachedResponse);
} else {
Toast.makeText(MainActivity.this, getString(R.string.network_error), Toast.LENGTH_LONG).show();
finish();
}
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("key", getResources().getString(R.string.api_key));
return headers;
}
};
strReq.setShouldCache(false);
AppController.getInstance().addToRequestQueue(strReq, Constants.TAG_STRING_REQ);
日志上的内容:
javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException:SSL 握手中止: ssl=0x61ff28f0:SSL 库失败,通常是协议错误 错误:14077410:SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报 握手失败(外部/openssl/ssl/s23_clnt.c:744 0x5df0b6fd:0x00000000)
【问题讨论】:
-
??? you can't make two SSL connection at same time。您可以断开连接并再次连接,或者您可以使用一个 ssl 连接进行两个请求,但您应该注意this issue。
-
我没有同时建立 2 个 SSL 连接,第二个从第一个的 onResponse 开始。
标签: android ssl https android-volley