android - 有时,Volley 无法从服务器返回响应

标签 android tomcat android-volley

我有两个使用 Volley 调用与 Web 服务器通信的 Android 应用程序:一个应用程序等待另一个应用程序发布一条短消息。大多数时候这工作正常:WAITING应用程序从发布应用程序获取响应。但是,每隔 5 次左右,第一个应用程序会发送响应,但第二个应用程序永远不会收到响应。相关代码如下:

邮寄代码:

    private synchronized void setGameProgress(String user_id, int pos, String letter, String accessToken) {
    String url = "";

    RequestQueue queue = Volley.newRequestQueue(activity);

    try {
        activity.runOnUiThread(new Runnable() {
            public void run() {
                spinner.setVisibility(View.VISIBLE);
            }
        });
        url = "https://www.chiaramail.com:443/GameServer/GameServer?user_ID=" + URLEncoder.encode(user_id, "UTF-8") + "&token=" + URLEncoder.encode(accessToken, "UTF-8") + "&cmd=" + URLEncoder.encode("SETGAME PROGRESS ", "UTF-8") + "&parms=" + URLEncoder.encode(user_id + " " + pos + " " + letter, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        Toast.makeText(activity, getString(R.string.error_updating_progress) + e.getMessage(), Toast.LENGTH_LONG).show();
        spinner.setVisibility(View.INVISIBLE);
    }

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    if (!response.startsWith("42 ")) {
                        queue_builder.setMessage(getString(R.string.error_updating_progress) + " " + response);
                        queue_alert = queue_builder.create();
                        queue_alert.show();
                    }
                    spinner.setVisibility(View.INVISIBLE);
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            volleyError = error;
            Toast.makeText(activity, getString(R.string.error_updating_progress) + volleyError.getMessage(), Toast.LENGTH_LONG).show();
            spinner.setVisibility(View.INVISIBLE);
        }
    });
    queue.add(stringRequest);
}

等待代码:

private synchronized void getGameProgress(final String user_id, final String accessToken) {
    String url = "";

    RequestQueue queue = Volley.newRequestQueue(activity);

    try {
        url = "https://www.chiaramail.com:443/GameServer/GameServer?user_ID=" + URLEncoder.encode(user_id, "UTF-8") + "&token=" + URLEncoder.encode(accessToken, "UTF-8") + "&cmd=" + URLEncoder.encode("GETGAME PROGRESS ", "UTF-8") + "&parms=" + URLEncoder.encode(user_id, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        Toast.makeText(activity, getString(R.string.error_getting_progress) + e.getMessage(), Toast.LENGTH_LONG).show();
    }

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    if (response.startsWith("43 ")) {
                        StringTokenizer st = new StringTokenizer(response.substring(3));
                        String position = st.nextToken();
                        String letter = st.nextToken();
                        updateTheirProgress(Integer.valueOf(position), letter);
                        getGameProgress(opponent_ID, AccessToken.getCurrentAccessToken().getToken());
                    } else {
                        queue_builder.setMessage(getString(R.string.error_getting_progress) + " " + response);
                        queue_alert = queue_builder.create();
                        queue_alert.show();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            volleyError = error;
            Toast.makeText(activity, getString(R.string.error_getting_progress) + volleyError.getMessage(), Toast.LENGTH_LONG).show();
        }
    });
    stringRequest.setRetryPolicy(new DefaultRetryPolicy(
            60000, 5,
            DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

    queue.add(stringRequest);
}

我知道服务器正在处理来自服务器日志的请求:

10212211883390475 2017-11-26, 17:57:40 42 
10212211883390475 2017-11-26, 17:57:40 43 4 s

除了一个 Volley 错误,我已经花了几天时间解决这个问题,我看不出问题是什么。有什么想法吗?

最佳答案

问题是由于 Apache 服务器在五分钟后超时造成的。当我将 Apache 中的超时设置更改为 -1(无限超时)时,问题得到解决。

关于android - 有时,Volley 无法从服务器返回响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47499490/

相关文章:

java - 如何通过单击 SearchView 打开新 Activity

rest - 当 POST 请求没有正文并且服务器响应是 403 禁止错误时 CORS 失败

tomcat - 如何将子域映射到 Tomcat 6 上的 Web 应用程序(包括根 Web 应用程序)?

android - 使用数组从数据库中设置表内的值

带搜索栏的 Android 密码强度检查器

android - 将 0 和 1 之间的值转换为十六进制

java - Tomcat spring boot 应用程序 LifecycleException

android - 如何在Android Activity中显示.cms图像文件

android - volley imageCache 和 imageRequest 都缓存图像

android - 了解android编程的xml文件