Android 应用程序在 post of firebase post 数据到服务器时崩溃

Android App crash on post of firebase post of data to server

我的 Android 应用程序在 firebase 服务器上的第二个 post 上崩溃。在 logcat 中显示如下:

08-14 20:01:55.775    2038-2047/com.spiralaxis.citiconnect E/StrictMode﹕ A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
    java.lang.Throwable: Explicit termination method 'close' not called
            at dalvik.system.CloseGuard.open(CloseGuard.java:184)
            at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:287)
            at com.android.org.conscrypt.OpenSSLSocketImpl.waitForHandshake(OpenSSLSocketImpl.java:623)
            at com.android.org.conscrypt.OpenSSLSocketImpl.getSession(OpenSSLSocketImpl.java:787)
            at com.firebase.tubesock.WebSocket.verifyHost(WebSocket.java:333)
            at com.firebase.tubesock.WebSocket.createSocket(WebSocket.java:319)
            at com.firebase.tubesock.WebSocket.run(WebSocket.java:117)

因为 Android 在资源非常受限的设备上运行,所以确保不浪费资源尤为重要。 Java 非常擅长确保资源在不需要时立即释放,并且对于许多事情它会自动执行此操作,但有些事情无法可靠地完成。

在 logcat 中发现的是您正在获取某种资源,但从未释放它。它看起来好像是您正在抓取的网络套接字。您是否打开了网络连接但在完成后没有再次关闭它?

这里是 Firebase 开发人员。我们将对此进行研究,并尝试在未来的 Firebase 版本中修复它。现在,我想你需要禁用 StrictMode.

完全同意

并从他自己添加: 每种本地包装语言中的每种资源(也在 Java 中)您需要关闭不需要更多使用的已打开资源。

在 Android 开发中,在这种情况下您需要检查关闭资源:

  • 位图
  • 光标
  • 等等

错误

A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.

意味着(可能在您的情况下)您在使用后没有关闭读取数据的流。

您需要获取响应流,完整读取并关闭它(即使响应代码不正确)-我的意思是 catch-finaly 块。

(此处为 firebase 开发人员) 我们有一个修复程序,将出现在我们 Android Firebase 客户端的下一版本中。在此之前,如果您使用严格模式,请使用 penaltylog 而不是 penaltydeath 并忽略错误。