HttpURLConnection 在某些设备上超时——非常神秘的行为

HttpURLConnection times out on certain devices -- very mysterious behavior

我有一个依赖于发出 POST/GET 请求的应用程序。我的应用程序正在通过同一 wifi 网络上的各种设备进行测试。

在某些设备上,我得到了 HttpURLConnection 的标准超时异常。

下面是超时发生的地方:

HttpURLConnection conn = (HttpURLConnection) ((new URL(
                    getString(R.string.base_url) + "/getnumbers").openConnection()));
            conn.setDoOutput(true);
            conn.setConnectTimeout(MainActivity.CONNECT_TIMEOUT_MS);
            conn.setReadTimeout(MainActivity.READ_TIMEOUT_MS);
            conn.setRequestProperty("Cookie", prefs.getString("sessionid", ""));
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Accept", "application/json");

            conn.setRequestMethod("POST");

            conn.connect();


            JSONObject progress = new JSONObject();
            try {
                progress.put("username", prefs.getString("username", ""));
            } catch (JSONException e) {
                e.printStackTrace();
            }  

            // posting it
            Writer wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(progress.toString());
            wr.flush();
            wr.close();

            is = conn.getResponseCode() >= 400 ? conn.getErrorStream() :
                    conn.getInputStream();

此应用适用于以下设备:

以下是导致超时问题的设备列表:

我尝试通过延长超时持续时间和执行 System.setProperty("http.keepAlive", "false") 来解决超时问题。 None 这些措施有所帮助。

考虑到超时发生在同一个 Wifi 网络上,我相当确定问题是由供应商特定的膨胀软件或其他一些 device/vendor/operator 特定问题引起的。

任何人都可以就可能导致此问题的原因分享他们的想法吗?

java.net.SocketTimeoutException

W/System.err: 在 java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) W/System.错误:在 java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:37) W/System.错误:在 java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237)

好的,所以通过 Play 商店发布应用程序似乎解决了(至少)其中一种设备(最近更新到 6.0.2 的 Note 4)的问题。

因此,有些设备在直接安装 APK 时似乎会超时,但在通过 Play 商店安装时可以正常工作。