首页 / 浏览问题 / 移动GIS / 问题详情
更换工作空间
24EXP 2019年05月28日

使用产品:iMobile 9D 操作系统:win10 x64
数据类型: 文件型
问题详细描述:我的App里要根据不同项目来更换工作空间(保存了基础地图),开始更换工作空间时,我没有考虑在重新创建工作空间时是否要释放当前的工作空间(目前我也不确定是否要释放),但当我打开多次不同项目并编辑了要素后,我的工作空间开始不能正常工作,现象是不能打开udb文件型数据源,代码如下:

mWorkspaceConnection = new WorkspaceConnectionInfo();
mWorkspaceConnection.setServer(mapPath);
mWorkspaceConnection.setType(WorkspaceType.SMWU);
mWorkspace = new Workspace();
mWorkspace.open(mWorkspaceConnection);
mSpatialDatasourceConnect = new DatasourceConnectionInfo();
mSpatialDatasourceConnect.setEngineType(EngineType.UDB);
mSpatialDatasourceConnect.setServer(mRootPath+"/spatial.udb");
mSpatialDatasourceConnect.setAlias("spatial");
mSpatialDatasourceConnect.setPassword("");

mSpatialDatasource = mWorkspace.getDatasources().open(mSpatialDatasourceConnect);

这个 mSpatialDatasource 对象在多次打开工作空间后返回空指针,这是什么问题?是否在打开新的工作空间时要释放当前的工作空间?如果需要这样做,能否提供一下代码片段参考一下!谢谢!

1个回答

你好,在关闭工作空间后是需要释放当前工作空间的,代码是workspace.close();workspace.dispose();
9,127EXP 2019年05月28日

您好,我修改后,老崩溃,这是更换工作空间的代码:

//更新工作空间
public void updateWorkspace(String mapPath) {
    try {
        //打开工作空间
        if (mWorkspace != null) {
            mMap.close();
            mWorkspace.close();
            mWorkspaceConnection.dispose();
        }

        mWorkspaceConnection = new WorkspaceConnectionInfo();
        mWorkspaceConnection.setServer(mapPath);
        mWorkspaceConnection.setType(WorkspaceType.SMWU);
        mWorkspace = new Workspace();
        mWorkspace.open(mWorkspaceConnection);

        //获取底图的坐标系统
        if(mWorkspace.getDatasources().getCount() > 0) {
            Datasource source = mWorkspace.getDatasources().get(0);
            mBaseMapPrjCoordSys = source.getPrjCoordSys();
        }

        //将地图显示控件和工作空间关联
        if (mMapView == null) {
            mMapView = (MapView) findViewById(R.id.map_view);
            mMapControl = mMapView.getMapControl();
        }
        mMap = mMapControl.getMap();
        mMap.setWorkspace(mWorkspace);

        //打开工作空间中的第一幅地图
        if (mWorkspace.getMaps().getCount() > 0) {
            mMap.open(mWorkspace.getMaps().get(0));
        }

        //设置可以动态投影
        mMap.setDynamicProjection(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

代码运行到 mMap.setWorkspace(mWorkspace); 崩溃,请帮忙看一下原因,谢谢!

能否把崩溃日志贴出来看一下

您好,我尝试了一下在更换当前工作空间前,先关闭当前工作空间中的所有数据源,把关闭工作空间的代码去掉,崩溃的问题没有再出现,代码:

try {
        //这里必须关闭所有的数据源
        if(mWorkspace != null) {
            mWorkspace.getDatasources().closeAll();
        }
        mWorkspaceConnection = new WorkspaceConnectionInfo();
        mWorkspaceConnection.setServer(mapPath);
        mWorkspaceConnection.setType(WorkspaceType.SMWU);
        mWorkspace = new Workspace();
        mWorkspace.open(mWorkspaceConnection);

        //获取底图的坐标系统
        if(mWorkspace.getDatasources().getCount() > 0) {
            Datasource source = mWorkspace.getDatasources().get(0);
            mBaseMapPrjCoordSys = source.getPrjCoordSys();
        }

        //将地图显示控件和工作空间关联
        if (mMapView == null) {
            mMapView = (MapView) findViewById(R.id.map_view);
            mMapControl = mMapView.getMapControl();
        }
        mMap = mMapControl.getMap();
        mMap.setWorkspace(mWorkspace);

        //打开工作空间中的第一幅地图
        if (mWorkspace.getMaps().getCount() > 0) {
            mMap.open(mWorkspace.getMaps().get(0));
        }

        //设置可以动态投影
        mMap.setDynamicProjection(true);

} catch (Exception e) {
    e.printStackTrace();
}
...