【发布时间】:2015-09-04 16:09:54
【问题描述】:
我在 Android 中使用 Volley 来执行我的应用请求。不幸的是,我收到以下错误:
com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x61e15f78: Failure in SSL library, usually a protocol error
error:1407743E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert inappropriate fallback (external/openssl/ssl/s23_clnt.c:744 0x5b647c58:0x00000000)
我在ViewPager 中使用了两个Fragments,它们在onResume 期间请求它们的内容。请求 url 基本相同,但查询参数(设置内容类型,例如趋势 vs 热门)。
网址格式为https://host/api/content?type={hot/trending}。授权是通过请求头完成的。
关于此异常的奇怪之处在于,两个请求中只有一个失败,并且不时会改变哪一个。在我在它们之间添加延迟后,异常停止发生(奇怪地指向某些竞争条件?)。但这似乎是一个糟糕的解决方法,我想以正确的方式解决这个问题。
有什么想法是什么原因造成的吗?
编辑:
请求以标准方式创建,使用提供队列的单例,如下:
final RequestQueue requestQueue = RequestQueueSingleton.getInstance(getActivity()).getRequestQueue();
final GsonRequestGet<SearchApiWrapper> gsonRequest = new GsonRequestGet<>(clazz, url,successListener, errorListener);
gsonRequest.setRetryPolicy(new DefaultRetryPolicy(3000, 3, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
gsonRequest.setTag(mTag);
requestQueue.add(gsonRequest);
这里是单例类:
public class RequestQueueSingleton {
private static RequestQueueSingleton mInstance;
private RequestQueue mRequestQueue;
private Context mContext;
public RequestQueueSingleton(Context context) {
mContext = context;
mRequestQueue = getRequestQueue();
}
/**
* Returns a instance of this singleton
*/
public static synchronized RequestQueueSingleton getInstance(Context context) {
if (mInstance == null) {
mInstance = new RequestQueueSingleton(context);
}
return mInstance;
}
/**
* Returns instance of the request queue
*/
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext());
}
return mRequestQueue;
}
}
【问题讨论】:
-
你是如何创建你的 Volley RequestQueue 的?
-
@GuilhE 我编辑了代码以添加 requestQueue 创建逻辑以及我如何使用它。
-
@EE66 在问我的问题之前,我确实调查了那个答案(和其他人),不幸的是,他们似乎不适用于这种情况,因为我的请求确实经常工作。唯一失败的时间是这两个片段同时将它们的请求添加到队列中。
-
我不知道这是否是您解决问题的原因,但我通常这样创建队列:
static { requestQueue = Volley.newRequestQueue(Application.getContext(), new HurlStack(null, ClientSSLSocketFactory.getSocketFactory())); }
标签: android android-volley sslexception