首页 / 浏览问题 / 移动GIS / 问题详情
切换不同的工作空间出现ANR
55EXP 2020年10月12日
按钮点击,切换工作空间,代码如下:我觉得代码应该没问题,就是有时这个会出现ANR;我记录了其中一次出现这种情况的log,我将其复制下来:

private void open(String path){
        if(!isCreated)
            init();
        isCreated = true;
        mworkspace = new Workspace();
        WorkspaceConnectionInfo connectionInfo = new WorkspaceConnectionInfo();
        connectionInfo.setServer(path);
        connectionInfo.setType(WorkspaceType.SMWU );
        mworkspace.open(connectionInfo);
        Datasource da = mworkspace.getDatasources().get(0);
        mmapControl = mapView.getMapControl();
        mmapControl.getMap().setWorkspace(mworkspace);
        map = mmapControl.getMap();
        maps = mworkspace.getMaps();
        layers = map.getLayers();
        if(maps.getCount()!=0){
            String mapname = mworkspace.getMaps().get(0);//打开第一幅地图
            map.open(mapname);
        }
        layer_btn.requestFocus();
        //显示特定比例尺,必须在地图加载完之后设置,否则不起作用
       // double [] doubles = new double[]{1.0/100.0,1.0/200.0,1.0/500.0,1.0/1000.0,1.0/2000.0,1.0/5000.0,1.0/10000.0,1.0/25000.0,1.0/50000.0,1.0/100000.0};
      //  map.setVisibleScales(doubles);
       // map.setVisibleScalesEnabled(true);

        Display display = getWindowManager().getDefaultDisplay();
        DisplayMetrics dm = new DisplayMetrics();
        display.getMetrics(dm);
        map.setMapDPI(dm.densityDpi);
        /*
        如果项目中包含测绘和勘探数据源,我们就将地图设置为其
        如果不包含,则将其设置为第一个数据源的投影
         */
        Myapplication myapplication = (Myapplication) getApplication();
        List<String> datasourName = new ArrayList<>();
        for(int i = 0; i< mworkspace.getDatasources().getCount();i++){
            datasourName.add(mworkspace.getDatasources().get(i).getAlias());
        }
        if(datasourName.contains("测绘") ){
            map.setPrjCoordSys(mworkspace.getDatasources().get("测绘").getDatasets().get("地质点").getPrjCoordSys());
            myapplication.settarget_PriCoordsys(mworkspace.getDatasources().get("测绘").getDatasets().get("地质点").getPrjCoordSys());
        }else if ( datasourName.contains("勘探")){
            map.setPrjCoordSys(mworkspace.getDatasources().get("勘探").getDatasets().get(0).getPrjCoordSys());
            myapplication.settarget_PriCoordsys(mworkspace.getDatasources().get("勘探").getDatasets().get(0).getPrjCoordSys());
        }else {
            map.setPrjCoordSys(mworkspace.getDatasources().get(0).getPrjCoordSys());
            Log.e("mapcontrol",mworkspace.getDatasources().get(0).getPrjCoordSys().getName());
            myapplication.settarget_PriCoordsys(mworkspace.getDatasources().get(0).getPrjCoordSys());
        }
        myapplication.setMapControl(mmapControl);

        //保存工程文名称,在后面具有很大的作用
        String [] split1 = path.split("/");
        String project_name= split1[split1.length-2];
        myapplication.setProject_Name(project_name);
        /*
        timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                if(map!=null){
                    map.refresh();
                }
            }
        };
        timer.schedule(timerTask,1000,3000);*/
    }

对应的log:

1个回答

您好,从代码中只能看出你打开工作空间后的操作,导致报错的操作是打开一个工作空间操作完后,关闭这个工作空间,再打开另外一个工作空间导致报错的吗?操作的具体流程和报错的具体点请再描述清楚一点。
2,042EXP 2020年10月13日
您好,就是这里报错。我是一个点击事件,然后里面调用这个open方法切换不同的工作空间,就是这个方法出现ANR,不是经常性的,偶尔出现这个问题。

我现在就是类似一个listView中的item,我这里面包含了不同的工程空间,就对应不同的 .swmu 文件,我点击任意一个,就可以进行工作空间的切换。然后就是通过这个open方法进行实现的。

我这样描述应该详细了吧。

您好,产生ANR的报错有很多种原因,但主要是主线程在处理比较耗时的操作,导致无法及时反应,可以参考一下这个博文:https://blog.csdn.net/jg_314816/article/details/51323684

另外做一个简单的测试,在主线程种通过点击不同的item按钮切换打开不同的工作空间是否能重现这个问题,且在打开另一个工作空间时先关闭原来的工作空间,并释放。

您好,我这是初始化,就是第一次进入主程序,不做任何其他的操作,所以应该不会有你链接给出的那种情况;还有就是,我这是第一次进入,那个工作空间肯定就是null,所以涉及不到关闭之前的然后进行释放一说。好像,我第一次打开之后,然后切换工作空间就不会出现这种情况。open方法就是我在主程序里执行的,没有其他任务了,照说这个应该不算耗时吧,没有io只有一个简单的切换以及设置。还有就是,用示例的数据,一般都较小,好像很少遇到这种情况。上面的这种情况是自己做的数据,里面数据集较大,不知道是不是这个原因引起的。

open方法这里anr之后,我看AS里面,提示的是 Environment.initialization(SettingoutActivity.this);这句话报错,但是这个首先不早都执行了吗?
...