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

时间:2017-03-11 04:48:02

标签: gluon gluon-mobile

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

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

Desktop Discrepancy

1 个答案:

答案 0 :(得分:1)

鉴于笔记本电脑/台式机没有配备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实现,在项目的Desktop / Java Package中创建DesktopPositionService类在包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()))));