【问题标题】:Code inside onCreate causes crash, but works inside init()onCreate 中的代码导致崩溃,但在 init() 中有效
【发布时间】:2015-12-29 15:04:34
【问题描述】:

首先,如果我不能说清楚,我想道歉。

我在使用 HERE 地图 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()

【问题讨论】:

  • MapEngine.init() 是异步方法。所以你需要等待初始化。然后你可以'RouteManager'
  • 哦,谢谢,我不知道。你是怎么知道的?还有其他方法吗?我只使用过一次异步任务(我对 Android 编程不是很有经验),但这并没有那么混乱,因为例如有 onPostExecute()。而且我不明白,为什么 init() 中的条目没有在其余的 onCreate() 之前处理
  • 这是文件; developer.here.com/mobile-sdks/documentation/android/… 。您可以将 OnEngineInitListener 视为 AsyncTask 并且 onEngineInitializationCompleted 类似于 onPostExecute() 方法。这些异步方法需要很长时间才能完成并在另一个线程上工作,否则主线程将被阻塞。
  • 好的,非常感谢!但是我是否必须将所有内容都压缩到 onEngineInitializationCompleted() 中?我很抱歉我的菜鸟问题,但据我所知,我只能在 init() 之后与地图交互,对吗?因此,不在 onEngineInitializationCompleted() 中的所有内容都会使应用程序崩溃,因为地图尚未初始化。我应该把我所有的代码都放在 onEngineInitializationCompleted() 中吗?
  • 我怎么知道该任务何时完成?

标签: android maps init oncreate here-api


【解决方案1】:

一般来说,任何HERE Mobile SDK相关的功能只有在地图初始化成功后才能使用,即一旦收到onEngineInitializationCompleted中的回调,在初始化完成之前无法使用SDK功能。

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

例如,对于共享代码,Route相关的操作可以移到一个函数中

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

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多