onCreate内的代码会导致崩溃,但可在init()中使用

问题描述 投票:0回答:1

首先,如果我不清楚自己的意思,我想道歉。

我在使用HERE Maps SDK时遇到问题。我无法使我的代码在onCreate语句内运行,但无法在地图的init()方法之外运行。

但是,如果我将最后的代码块放在init()和if语句的末尾,则一切正常。我只是想知道我是否应该处理init()中的所有内容。我想那会很混乱/拥挤...

这是我的代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Search for the map fragment to finish setup by calling init()
    mapFragment = (MapFragment)getFragmentManager().findFragmentById(R.id.mapfragment);
    mapFragment.init(new OnEngineInitListener() {
        @Override
        public void onEngineInitializationCompleted(OnEngineInitListener.Error error) {
            if (error == OnEngineInitListener.Error.NONE) {
                // retrieve a reference of the map from the map fragment
                map = mapFragment.getMap();
                // Set the map center to the Berlin region
                map.setCenter(new GeoCoordinate(52.520413, 13.405218, 0.0), Map.Animation.LINEAR);
                // Set the zoom level to the average between min and max
                map.setZoomLevel((map.getMaxZoomLevel() + map.getMinZoomLevel()) / 1.5);

                map.getMapTransitLayer().setMode(MapTransitLayer.Mode.EVERYTHING);

                mapFragment.getMapGesture().addOnGestureListener(new MyOnGestureListener());

                posManager = PositioningManager.getInstance();

                // Register positioning listener
                posManager.addListener(new WeakReference<>(positionListener));

                posManager.start(PositioningManager.LocationMethod.GPS_NETWORK);
                posManager.getPosition();

                map.getPositionIndicator().setVisible(true);

            } else {
                System.out.println("ERROR: Cannot initialize Map Fragment");
            }
        }

    });

    RouteManager rm = new RouteManager();

    RoutePlan routePlan = new RoutePlan();
    routePlan.addWaypoint(new GeoCoordinate(posManager.getLastKnownPosition().getCoordinate()));
    routePlan.addWaypoint(new GeoCoordinate(52.520413, 13.405218));

    // Create the RouteOptions and set its transport mode & routing type
    RouteOptions routeOptions = new RouteOptions();
    routeOptions.setTransportMode(RouteOptions.TransportMode.CAR);
    routeOptions.setRouteType(RouteOptions.Type.FASTEST);

    routePlan.setRouteOptions(routeOptions);

    // Calculate the route
    rm.calculateRoute(routePlan, new RouteListener());


}

在init()语句的分号之后,在显示RouteManager rm = new RouteManager();的行中,出现以下错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.here.android.tutorial.basicmapsolution/com.here.android.tutorial.basicmapsolution.BasicMapActivity}: com.here.android.mpa.common.UnintializedMapEngineException: Cannot created HERE SDK objects before MapEngine is initialized.  See MapEngine.init()
Caused by: com.here.android.mpa.common.UnintializedMapEngineException: Cannot created HERE SDK objects before MapEngine is initialized.  See MapEngine.init()
android maps init oncreate here-api
1个回答
0
投票

[较旧的主题,如果有人遇到类似问题,请回答。通常,只有在成功初始化地图之后,才能使用任何与HERE Mobile SDK相关的功能,即,一旦收到onEngineInitializationCompleted中的回调,在初始化完成之前,无法使用SDK函数。

从代码可维护性的角度来看,总是可以将代码移到一个单独的模块化函数中,并在onEngineInitializationCompleted提供回调后调用该函数

例如,对于共享代码,可以将与路线相关的操作移入功能中

private void calculateRoute(){
   RouteManager rm = new RouteManager();

    RoutePlan routePlan = new RoutePlan();
    routePlan.addWaypoint(new GeoCoordinate(posManager.getLastKnownPosition().getCoordinate()));
    routePlan.addWaypoint(new GeoCoordinate(52.520413, 13.405218));

    // Create the RouteOptions and set its transport mode & routing type
    RouteOptions routeOptions = new RouteOptions();
    routeOptions.setTransportMode(RouteOptions.TransportMode.CAR);
    routeOptions.setRouteType(RouteOptions.Type.FASTEST);

    routePlan.setRouteOptions(routeOptions);

    // Calculate the route
    rm.calculateRoute(routePlan, new RouteListener());
}

然后在回调中调用此函数

mapFragment.init(new OnEngineInitListener() {
    @Override
    public void onEngineInitializationCompleted(OnEngineInitListener.Error error) {
        if (error == OnEngineInitListener.Error.NONE) {
             .... 
         // call the private function 
         calculateRoute();

        } else {
            System.out.println("ERROR: Cannot initialize Map Fragment");
        }
    }

});
© www.soinside.com 2019 - 2024. All rights reserved.