Код внутри 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");
}
}
});