来自Chilkat库的CkFtp2类的Android App崩溃

问题描述 投票:0回答:1

我正在开发和Android应用程序,它使用FTP通信,只是随机,我得到此错误,没有跟踪我的实际代码或由我编码的任何执行。

我不能重现崩溃,我不知道它何时发生或为什么。

这是我得到的错误:

Fatal Exception: java.util.concurrent.TimeoutException: com.chilkatsoft.CkFtp2.finalize() timed out after 10 seconds
   at com.chilkatsoft.chilkatJNI.delete_CkFtp2(chilkatJNI.java)
   at com.chilkatsoft.CkFtp2.delete(CkFtp2.java:32)
   at com.chilkatsoft.CkFtp2.finalize(CkFtp2.java:25)
   at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:229)
   at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:207)
   at java.lang.Thread.run(Thread.java:818)

我有Fabric的Crashlytics,这就是它给我看的内容:

enter image description here

再一次,没有跟踪我的代码或我编码的任何东西,所以我真的不知道为什么我的应用程序崩溃。

android java-native-interface chilkat
1个回答
0
投票

显然,如果JVM垃圾收集时间过长,可能会发生崩溃。

在这种情况下,您正在清理CkFtp2对象实例。如果CkFtp2对象与FTP服务器有连接,则在对象析构函数中关闭连接。如果连接为TLS,则TLS会话将完全关闭。 (TCP套接字连接也是干净利落的。)如果来自服务器的响应时间不快,这可能会导致延迟。在从对象实例中删除最后一个引用之前,通过调用CkFtp2.Disconnect()确保显式关闭每个CkFtp2对象的连接。这可能会解决问题,因为一旦断开连接,就没有连接关闭。

另一种可能性与后台线程和异步有关。例如,假设您启动了异步操作 - 例如调用GetFileAsync。然后删除对CkFtp2对象的最后一个引用,Java垃圾回收决定清理该对象。 Java垃圾收集器不知道对正在执行异步操作的对象有另一个本机引用。它尝试删除本机对象,但必须等待获取内部“临界区”。因此垃圾收集器等待异步操作完成,这就是原因。在异步操作运行时,您不希望删除最后一个Java引用。在异步操作完成之前,至少保留一个对象的Java引用。

© www.soinside.com 2019 - 2024. All rights reserved.