在我的某个应用程序中,我使用 Google 提供的volley
向服务器发送请求。
问题:onErrorResponse(VolleyError error)
到目前为止我尝试了什么:
1)首先我得到了null错误对象,所以使用下面的代码来解决它:
@Override
protected void deliverResponse(String response) {
super.deliverResponse(response);
}
@Override
public void deliverError(VolleyError error) {
super.deliverError(error);
DebugLog.e("deliverResponse", "getNetworkTimeMs : " + error.getNetworkTimeMs());
}
到目前为止,当我收到错误对象timeout
时,我发现null
正在发生。
2)现在,应用适用于Android
和iOS
以及web
但timeout
只适用于Android
。
要求的排球日志:
BasicNetwork.logSlowRequests: HTTP response for request
编辑注:
服务器端开发的Web服务对于所有三个实例(Android,Web和iOS)都是相同的。
Timeout
。
我已将时间设定为2分钟,但有时仅在30秒内排球超时。
我有很多答案可以改变服务器,但因为不可能有任何其他解决方案。
我还想补充一点,如果我可以获得有关何时可以在凌空中超时的更多信息?
参考资料我已经完成了:
httpclient-often-times-out-using-wifi-is-going-fine-with-3g
long_xmlhttprequest_ajax_requests_timeout_on_android
已编辑:
我还设置了重试政策如下:
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 48,
0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
如果连接超时,我也不想重试。
如何进行有效的服务调用,以解决timeout
的问题。
任何帮助都会得到满足。
感谢。
答案 0 :(得分:4)
由于我试图解决这个问题大约两个月,我没有得到任何完美的解决方案。虽然我分析了以下一些事实:
HttpURLConnection
发出网络服务请求,但仍然遇到同样的问题。所以我认为这个问题并非具体来自凌空,但是你得到了这个问题,我建议通过RetryPolicy
以下的自定义提高服务器性能:
int x=2;// retry count
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 48,
x, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
希望它会有所帮助。
建议随时欢迎:)
如果您找到更合适的解决方案,请在下方发表评论。
感谢!
答案 1 :(得分:2)
恕我直言,您可以参考以下内容:
在BasicNetwork.java
内,您会找到一些信息,例如:
...
private static int SLOW_REQUEST_THRESHOLD_MS = 3000;
...
/**
* Logs requests that took over SLOW_REQUEST_THRESHOLD_MS to complete.
*/
private void logSlowRequests(long requestLifetime, Request<?> request,
byte[] responseContents, StatusLine statusLine) {
if (DEBUG || requestLifetime > SLOW_REQUEST_THRESHOLD_MS) {
VolleyLog.d("HTTP response for request=<%s> [lifetime=%d], [size=%s], " +
"[rc=%d], [retryCount=%s]", request, requestLifetime,
responseContents != null ? responseContents.length : "null",
statusLine.getStatusCode(), request.getRetryPolicy().getCurrentRetryCount());
}
}
...
// if the request is slow, log it.
long requestLifetime = SystemClock.elapsedRealtime() - requestStart;
logSlowRequests(requestLifetime, request, responseContents, statusLine);
...
因此,如果您的项目使用Google的排球作为模块(而不是JAR文件),则可以更新BasicNetwork.java
,增加SLOW_REQUEST_THRESHOLD_MS
值,例如10000(ms)或更多。
另一种选择,根据@ neuron在以下问题中的回答:
How to optimize network-queue-take in android Volley? (Volley Google IO 2013)
我认为您可以尝试在应用中使用以下构造函数来增加 NETWORK_THREAD_POOL_SIZE 的值:
public RequestQueue(Cache cache, Network network, int threadPoolSize) {
this(cache, network, threadPoolSize,
new ExecutorDelivery(new Handler(Looper.getMainLooper()))); }
P / S:如果您只想在不增加 NETWORK_THREAD_POOL_SIZE 的情况下再显示行BasicNetwork.logSlowRequests: HTTP response for request
,则只需对//
行进行评论logSlowRequests...
上面(当你的应用使用Google的排球作为模块时 - 不是jar文件,而不是compile mcxiaoke...
文件中的build.gradle
希望它有所帮助!
答案 2 :(得分:1)
public class JGet extends Request {
private final Response.Listener listener;
public JGet(final String url, List params,
Response.Listener responseListener) {
super(Request.Method.GET, NetUtils.getUrlWithParams(url, params), new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
NetUtils.dealVolleyError(volleyError, url);
}
});
this.listener = responseListener;
this.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 0, 1.0f));
LogUtils.e("request-start--->");
LogUtils.e(url);
LogUtils.e(params);
LogUtils.e("request-start--->");
}
}
设置超时时间。
答案 3 :(得分:0)
使用volley向PHP文件发送请求时,请尝试不使用 require 语句连接到数据库。 我注意到只有当我使用类似的东西时才会超时(需要“init.php”) 但是,当我直接将我的数据库连接信息放在同一个文件中时,一切似乎都能正常工作。
答案 4 :(得分:0)
request.setRetryPolicy(new DefaultRetryPolicy(50000,5,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT))