Android StrictMode Throwable:显式终止方法'end'不调用



我看到一个StrictMode失败,我看不出我在做什么是错的。失败是:

java.lang.Throwable: Explicit termination method 'end' not called
    E/StrictMode(26875):    at dalvik.system.CloseGuard.open(CloseGuard.java:184)
    E/StrictMode(26875):    at java.util.zip.Inflater.<init>(Inflater.java:82)
    E/StrictMode(26875):    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:96)
    E/StrictMode(26875):    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81)
    E/StrictMode(26875):    at libcore.net.http.HttpEngine.initContentStream(HttpEngine.java:528)
    E/StrictMode(26875):    at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:836)
    E/StrictMode(26875):    at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274)
    E/StrictMode(26875):    at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:486)
    E/StrictMode(26875):    at com.mycompany.MyClass.sendJson(MyClass.java:267)

我配置StrictMode:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
              .detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog()
                    .penaltyDeath().build());
}

代码如下所示:

HttpURLConnection connection = null;
OutputStream outputStream = null;
InputStream in = null;
try {
        connection = (HttpURLConnection)new URL("http://our.server/some/path").openConnection();
        connection.setRequestProperty("Accept", "application/json");
        connection
                .setRequestProperty("Content-Type", "application/json; charset=UTF-8");
        connection.setDoOutput(true);
        outputStream = connection.getOutputStream();
        String content = "{"some":"json data"}";
        byte bytes[] = content.getBytes("UTF-8");
        outputStream.write(bytes);
        outputStream.flush();
        responseCode = connection.getResponseCode(); // This is line 267 in the stack trace
        if (HttpURLConnection.HTTP_OK == responseCode
                || HttpURLConnection.HTTP_CREATED == responseCode) {
            // do something with a successful response
        }
    }
} catch (IOException e) {
    // report the exception
} finally {
    if (null != connection) {
        connection.disconnect();
    }
    if (null != outputStream) {
        try {
            outputStream.close();
        } catch (IOException e) {
        }
    }
    if (null != in) {
        try {
            in.close();
        } catch (IOException e) {
        }
    }
}

我发现有人在使用Google AdMob SDK (https://groups.google.com/forum/?fromgroups=#!topic/google-admob-ads-sdk/yVss4ufdPp4)时抱怨看到相同的StrictMode失败,但到目前为止我还没能找到任何解决方案。

如果您获得响应流,完整地读取它并关闭它(即使响应代码不正确)会发生什么?
我认为这将调用HttpEngine.release(),从而避免了GzipInputStream后来最终确定时的异常(因为异常是在构造函数中准备的,但在finalize()中抛出)

我认为connection.getResponseCode()打开了一个输入流。因此,您需要检索输入流并关闭它。

最新更新