2017-02-06 2 views
1

Я хотел спросить, есть ли у кого-нибудь проблемы с использованием плагина Gluon Charm Down для ориентации экрана для IOS?Null Pointer при чтении ориентации экрана от Gluon Charm Down

JFXMobile Плагин: org.javafxports:jfxmobile-plugin:1.3.2

Charm Версия: com.gluonhq:charm:4.2.0

downConfig { 
     version = '3.1.0' 
     plugins 'display', 'lifecycle', 'statusbar', 'storage', 'orientation' 
} 

Когда я пытаюсь вызвать его, как это:

Services.get(OrientationService.class).ifPresent(service -> { 
    onOrientationChange(service.orientationProperty(), null, service.getOrientation().orElse(Orientation.VERTICAL)); 
    service.orientationProperty().addListener(this::onOrientationChange); 
}); 

я получаю исключение на консоль:

Exception in Preloader start method 
2017-02-06 10:43:37.104693 MyApp[447:282589] Orientation is Unknown 
QuantumRenderer: shutdown 
java.lang.RuntimeException: Exception in Preloader start method 
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$156(LauncherImpl.java) 
    at com.sun.javafx.application.LauncherImpl$$Lambda$2.run(Unknown Source) 
    at java.lang.Thread.run(Thread.java) 
Caused by: java.lang.NullPointerException 
    at com.gluonhq.charm.down.plugins.ios.IOSOrientationService.getOrientation(IOSOrientationService.java) 
    at my.app.Preloader.lambda$start$24(Preloader.java) 
    at my.app.Preloader$$Lambda$3.accept(Unknown Source) 
    at java.util.Optional.ifPresent(Optional.java) 
    at my.app.Preloader.start(Preloader.java) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java) 
    at com.sun.javafx.application.LauncherImpl$$Lambda$7.run(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$7.run(Unknown Source) 
    at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$19.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(AccessController.java) 
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java) 
    at com.sun.javafx.application.PlatformImpl$$Lambda$6.run(Unknown Source) 
    at org.robovm.apple.uikit.UIApplication.main(UIApplication.java) 
    at org.robovm.apple.uikit.UIApplication.main(UIApplication.java) 
    at org.javafxports.jfxmobile.ios.BasicLauncher.main(BasicLauncher.java) 

Глядя на code, я предполагаю, что может быть только одна причина, по этому вопросу:

@Override 
public final Optional<Orientation> getOrientation() { 
    switch (orientationText) { 
     case "Portrait": 
     case "PortraitUpsideDown": 
      return Optional.of(Orientation.VERTICAL); 
     case "LandscapeLeft": 
     case "LandscapeRight":  
      return Optional.of(Orientation.HORIZONTAL); 
     case "Unknown":    
     default:     
      return Optional.empty(); 
    } 
} 

Мое предположение, что orientationText является null и, следовательно, он выходит из строя.

Линия 2017-02-06 10:43:37.104693 MyApp[447:282589] Orientation is Unknown вносит свой вклад в это, я думаю.

Это ошибка? Есть ли способ обойти это? (Например, есть некоторый набор вверх необходимо на IOS, как система разрешения на Android?)

Заранее спасибо и уважением,

Daniel


#edit:onOrientationChange метод не очень сложно:

private void onOrientationChange(ObservableValue<? extends Orientation> obs, Orientation o, Orientation n) { 
    if (n == null || splashPane == null) 
     return; 
    splashPane.pseudoClassStateChanged(vertical, Orientation.VERTICAL == n); 
    splashPane.pseudoClassStateChanged(horizontal, Orientation.HORIZONTAL == n); 
} 

Поэтому, я думаю, этого было бы достаточно, чтобы обновить код до sth. как этот

Services.get(OrientationService.class).ifPresent(service -> { 

service.orientationProperty() AddListener (это :: onOrientationChange). });

(он работает на Android, так что я мог бы альтернативно проверить платформу и сделать это только на не-IOS или около того)

+1

Учитывая, что журнал дает не нулевую ориентацию, я не думаю, что значение 'orientText' равно null. Можете ли вы изменить свой обработчик событий? Не используйте 'onOrientationChange' пока. Просто распечатайте новое значение ориентации: 'service.orientationProperty(). AddListener ((obs, ov, nv) -> System.out.println (" O: "+ nv));' и посмотреть, не сработает ли он. –

+0

Я обновил свой вопрос (см. Его нижнюю часть) с содержимым 'onOrientationChange' - но да, я могу попробовать это. Вы дадите результат после обеда, хорошо? – dzim

ответ

1

Я могу воспроизвести вашу NPE.

Ошибка возникает, когда вы «охотно» звоните service.getOrientation().

Если у вас есть взгляд на code, orientationText не инициализирован, и это только тогда, когда служба инициализируется и наблюдатель начинает что значение извлекается из родного слоя IOS и установить с Platform::runLater.

Это означает, что для получения начального значения для orientationText требуется некоторое время.

Быстрое решение, чтобы избежать NPE использует регулярные ChangeListener<Observation> вместо вашего метода onOrientationChange:

private final ChangeListener<Orientation> onOrientationChange = 
    (ObservableValue<? extends Orientation> obs, Orientation ov, Orientation nv) -> { 
    if (nv == null || splashPane == null) 
     return; 
    splashPane.pseudoClassStateChanged(vertical, Orientation.VERTICAL == nv); 
    splashPane.pseudoClassStateChanged(horizontal, Orientation.HORIZONTAL == nv); 
} 

Services.get(OrientationService.class).ifPresent(service -> { 
    service.orientationProperty().addListener(onOrientationChange); 
}); 

Во всяком случае, я подам вопрос, чтобы добавить начальное значение orientationText.

+0

Извините, что я забыл ответить вчера. Во всяком случае: Да - я уже сделал, как вы предложили в своем комментарии, и удалил явный вызов '# getOrientation' и только полагался на слушателя. Большое спасибо! Опять же ... – dzim

+1

Нет проблем, проблема исправлена. Он доступен с моментальным снимком Charm Down или после следующего выпуска. –

Смежные вопросы