服务器请求超时使用" Volley"仅适用于Android而非iOS

时间:2015-11-06 04:50:20

标签: android http web timeout android-volley

在我的某个应用程序中,我使用 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)现在,应用适用于AndroidiOS以及webtimeout只适用于Android

要求的排球日志:

BasicNetwork.logSlowRequests: HTTP response for request

编辑注:

  1. 服务器端开发的Web服务对于所有三个实例(Android,Web和iOS)都是相同的。

  2. 当有太多用户向服务器发出请求时,会发生
  3. Timeout

  4. 我已将时间设定为2分钟,但有时仅在30秒内排球超时

  5. 我有很多答案可以改变服务器,但因为不可能有任何其他解决方案。

  6. 我还想补充一点,如果我可以获得有关何时可以在凌空中超时的更多信息?

    参考资料我已经完成了:

    Optimizing Volley

    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的问题。

    任何帮助都会得到满足。

    感谢。

5 个答案:

答案 0 :(得分:4)

由于我试图解决这个问题大约两个月,我没有得到任何完美的解决方案。虽然我分析了以下一些事实:

  1. 您可以升级服务器的性能
  2. 我尝试使用HttpURLConnection发出网络服务请求,但仍然遇到同样的问题。
  3. 所以我认为这个问题并非具体来自凌空,但是你得到了这个问题,我建议通过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))