百度地图Android SDK运行时遇到Fatal signal 11 (SIGSEGV)问题的解决方法

现象repro:

1. 第一次运行App,没有问题。

2. 按返回键推出App。

3. 再次运行App,出现如下错误,App无法启动。

4. 再次运行App,App正常启动。

5. 如此往复。


百度地图Android SDK运行时遇到Fatal signal 11 (SIGSEGV)问题的解决方法
 

原因:

这个错误发生在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));
	}

相关推荐