Откуда вызывается Component.deinitialize()?

#codenameone

#codenameone

Вопрос:

На iPhone у меня часто возникают исключения нулевого указателя в SwipeableContainer.close() из-за того, что getComponentForm возвращает null (см. stacktrace ниже). Я предполагаю, что это означает, что SwipeListener не был удален правильно, что, по-видимому, происходит в SwipeableContainer.deinitialize(). Однако я не могу понять, откуда должна вызываться функция deinitialize(), поэтому я не понимаю, что мне нужно сделать, чтобы избежать этой ситуации.

Есть какие-нибудь идеи?

      [EDT] 12:19:43,5 - Exception: java.lang.NullPointerException - null 
     java.lang.NullPointerException
       at com_codename1_ui_SwipeableContainer.close:199
       at com_codename1_ui_SwipeableContainer_SwipeListener.actionPerformed:437
       at com_codename1_ui_util_EventDispatcher.fireActionSync:459
       at com_codename1_ui_util_EventDispatcher.fireActionEvent:362
       at com_codename1_ui_Form.fireReleaseListeners:3770
       at com_codename1_ui_Form.pointerReleased:3847
       at com_codename1_ui_Component.pointerReleased:4710
       at com_codename1_ui_Display.handleEvent:2359
 

Ответ №1:

деинициализация должна вызываться при удалении компонента или формы. Но в этом случае это может привести к сбою, если у нас есть цепочка событий с несколькими операциями, где действие пользователя может вызвать как закрытие, так и удаление.

Обходной путь состоит в том, чтобы обернуть вторую операцию в a callSerially , чтобы отложить ее до следующего цикла EDT, но на данный момент я просто добавил исправление к исключению нулевого указателя close() , чтобы метод не сработал, если нет родительского Form элемента.