Сбой Android-приложения в классе CkFtp2 из библиотеки Chilkat - PullRequest
0 голосов
/ 21 января 2019

Я разрабатываю и приложение для 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

Опять же, нет никакого следа для моего кода или чего-либо, написанного мной вообще, поэтому я буквально не знаю, почему мое приложение падает.

1 Ответ

0 голосов
/ 01 апреля 2019

Очевидно, что сбой может произойти, если сборка мусора JVM занимает слишком много времени.

В этом случае вы очищаете экземпляр объекта CkFtp2.Если объект CkFtp2 имел соединение с FTP-сервером, то соединение закрывается в деструкторе объекта.Если соединение как TLS, то сеанс TLS чисто закрыт.(Также соединение сокета TCP чисто закрыто.) Это может вызвать задержку, если время отклика с сервера не быстрое.Убедитесь, что каждое соединение объекта CkFtp2 явно закрыто, вызвав CkFtp2.Disconnect () перед удалением вашей последней ссылки из экземпляра объекта.Это может решить проблему, потому что после отключения нет соединения для закрытия.

Другая возможность связана с фоновыми потоками и асинхронностью.Например, допустим, вы запускаете асинхронную операцию, например, вызываете GetFileAsync.Затем вы удаляете свою последнюю ссылку на объект CkFtp2, и сборщик мусора Java решает очистить объект.Java сборщик мусора не знает, что есть другая нативная ссылка на объект, который выполняет асинхронную операцию.Он пытается удалить собственный объект, но должен дождаться получения внутреннего «критического раздела».Таким образом сборщик мусора застревает в ожидании завершения асинхронной операции, и это будет причиной.Вы не хотите удалять свою последнюю ссылку на Java во время выполнения асинхронной операции.Сохраняйте хотя бы одну ссылку Java на объект до тех пор, пока асинхронная операция не будет завершена.

...