用于桌面的 Gluon PositionService - 测试目的

Gluon PositionService for Desktop - Testing Purposes

我希望能够从我的笔记本电脑上测试 Gluon PositionService。这可能吗?查看运行时依赖项,iOS 和 Android 包含此 jar 文件。桌面依赖项没有它。

能够从我的笔记本电脑上测试此服务的解决方法是什么。我现在只想能够将位置打印到控制台。这是我的笔记本电脑的限制吗?

鉴于 laptop/desktop 机器不包含 GPS 传感器,DesktopPositionService 实施没有任何意义。

但是如果您只想在笔记本电脑上测试您的移动代码,您可以轻松创建一个假任务,在给定时间段后随机提供一个新位置。

有两种简单的方法可以在桌面上模拟 PositionService

其一,通过简单地为您实际上没有 PositionService 实现的情况提供替代方案:

Services.get(PositionService.class)
        .map(s -> {
            // Mobile - real implementation
            s.positionProperty().addListener((obs, ov, nv) -> 
                System.out.println(String.format("Lat: %.6f, Lon: %.6f", nv.getLatitude(), nv.getLongitude())));
            return s.getPosition();
        }).orElseGet(() -> {
            if (Platform.isDesktop()) {
                // Desktop - Mock implementation
                PauseTransition pause = new PauseTransition(Duration.seconds(5));
                pause.setOnFinished(t -> {
                    System.out.println(String.format("Lat: %.6f, Lon: %.6f", new Random().nextFloat() * 100, new Random().nextFloat() * 100));
                    pause.playFromStart();
                });
                pause.play();
            }
            return null;
        }); 

还有两个,按照 Charm Down 中所有不同 plugins 的设计,通过实际提供 PositionService 实现,在 DesktopPositionService class =33=]你的项目包在包com.gluonhq.charm.down.plugins.desktop.

package com.gluonhq.charm.down.plugins.desktop;

import com.gluonhq.charm.down.plugins.Position;
import com.gluonhq.charm.down.plugins.PositionService;
import java.util.Random;
import javafx.animation.PauseTransition;
import javafx.beans.property.ReadOnlyObjectProperty;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.util.Duration;

public class DesktopPositionService implements PositionService {

    private final ReadOnlyObjectWrapper<Position> positionProperty = new ReadOnlyObjectWrapper<>();

    public DesktopPositionService() {
        mockPosition();
    }

    @Override
    public ReadOnlyObjectProperty<Position> positionProperty() {
        return positionProperty.getReadOnlyProperty();
    }

    @Override
    public Position getPosition() {
        return positionProperty.get();
    }

    private void mockPosition() {
        PauseTransition pause = new PauseTransition(Duration.seconds(5));
        pause.setOnFinished(t -> {
            positionProperty.set(new Position(new Random().nextFloat() * 100, new Random().nextFloat() * 100));
            pause.playFromStart();
        });
        pause.play();
    }
}

所以现在这将适用于移动设备(真实传感器)和桌面设备(模拟):

Services.get(PositionService.class)
        .ifPresent(s -> 
             s.positionProperty().addListener((obs, ov, nv) -> 
                System.out.println(String.format("Lat: %.6f, Lon: %.6f", nv.getLatitude(), nv.getLongitude()))));