Код внутри onCreate вызывает сбой, но работает внутри init()

Прежде всего, я хочу извиниться, если не могу прояснить ситуацию.

У меня проблема с использованием 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()

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");
        }
    }

});
Другие вопросы по тегам