?
现象repro:
1. 第一次运行App,没有问题。
2. 按返回键推出App。
3. 再次运行App,出现如下错误,App无法启动。
4. 再次运行App,App正常启动。
5. 如此往复。
?
原因:
这个错误发生在App启动,初始化百度地图时。通常是由上次退出App时百度地图的后台Service资源释放不完全造成的。
如果该错误出现在退出App时,则是百度地图相关模块的Destory顺序有问题。
?
正确初始化/释放时序:
private BMapManager mBMapManager; private MapView mMapView; private MKOfflineMap mapOffline; private MKSearch mapSearch; private Context context; @Override protected void onCreate(Bundle savedInstanceState) { Log.i(Name, "onCreate"); super.onCreate(savedInstanceState); this.context = this.getApplicationContext(); mBMapManager = new BMapManager(getApplication()); mBMapManager.init("your key", null); /*** * 必须在初始化百度地图manager之后才能setContentView * 在官方文档中也有相同描述 ***/ setContentView(R.layout.activity_main); GeoPoint yourLocation = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)); initBaiduMap(yourLocation); } @Override protected void onDestroy() { Log.i(Name, "onDestroy"); /*** * 必须按此顺序执行destory! * 有使用离线地图的离线地图控制器也要销毁 ***/ mapOffline.destroy(); mMapView.destroy(); mBMapManager.destroy(); super.onDestroy(); } @Override protected void onPause() { Log.i(Name, "onPause"); mMapView.onPause(); mBMapManager.stop(); super.onPause(); } @Override protected void onResume() { Log.i(Name, "onResume"); mMapView.onResume(); mBMapManager.start(); super.onResume(); } private void initBaiduMap(GeoPoint point) { mMapView = (MapView) findViewById(R.id.bmapsView); mMapView.setBuiltInZoomControls(true); MapController mMapController = mMapView.getController(); mapOffline = new MKOfflineMap(); mapOffline.init(mMapController, new MKOfflineMapListener() { @Override public void onGetOfflineMapState(int type, int state) { switch (type) { case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: MKOLUpdateElement update = mapOffline.getUpdateInfo(state); break; case MKOfflineMap.TYPE_NEW_OFFLINE: Log.d("OfflineDemo", String.format("add offlinemap num:%d", state)); break; case MKOfflineMap.TYPE_VER_UPDATE: Log.d("OfflineDemo", String.format("new offlinemap ver")); break; } } }); int num = mapOffline.scan(); System.out.println(">>>offlineMaps: " + num); mMapController.setCenter(point); mMapController.setZoom(12); mapSearch = new MKSearch(); mapSearch.init(mBMapManager, new BaiduMapSearchListener(this, mMapView)); }
?