首页 / 浏览问题 / 移动GIS / 问题详情
制作添加专题图后崩溃
mxc
112EXP 2019年07月08日

使用产品  supermap-imobile-9.1.2-171-android-zip-chs 操作系统 Android

数据类型 网络数据源

问题详细描述 :在添加 专题图后 会出现崩溃的情况,这种情况不是必然出现,会偶尔出现几次,崩溃日志 很少.只有一句话.

A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x2811ac in tid 25342 (Thread-1182), pid 25307

添加专题图的代码如下:


    public void makeTheme( DatasetVector dataset) {

        String field = "mileage";
        FieldInfos fieldInfos = dataset.getFieldInfos();
        //把 mileage 字段重置
        if (fieldInfos.indexOf(field) != -1) {
            fieldInfos.remove(field);
        }
        FieldInfo fieldInfo = new FieldInfo();
        fieldInfo.setName(field);
        fieldInfo.setDefaultValue("-1");
        fieldInfo.setRequired(false);
        fieldInfo.setType(FieldType.DOUBLE);
        fieldInfo.setCaption(field);
        fieldInfos.add(fieldInfo);
        fieldInfo.dispose();
        
        //设置数据
        double min = items.get(0).getMileage();
        double max = 0;
        for (Item record : items) {
            //行政区划
            String xzqh = record.getZone();
            String sql = "ZONE_NUMBE = '" + xzqh + "00'";
            Recordset query = dataset.query(sql, CursorType.DYNAMIC);
            if (query.getRecordCount() == 0) {
                query.close();
                query.dispose();
                continue;
            }
            //值
            double value = record.getMileage();


            query.moveFirst();
            query.edit();
            query.setFieldValue(field, value);
            query.update();
            query.close();
            query.dispose();
            if (value > max) {
                max = value;
            }
            if (value < min) {
                min = value;
            }

            String str = String.format("行政区划(%s),value(%f)", xzqh, value);
//            Log.e(MainActivity.class.getSimpleName(), "makeTheme: " + str);
        }

        //数据准备完毕制作专题图
        double range = max - min;

        //分段专题图
        ThemeRange themeRange = new ThemeRange();
        themeRange.setRangeExpression(field);
        // 填充样式设置
        GeoStyle geoStyle = new GeoStyle();
        //                        geoStyle.setLineColor(new Color(255, 204, 188, 255));
        geoStyle.setLineColor(new Color(255, 209, 128, 255));
        geoStyle.setLineWidth(0.3);

        ThemeRangeItem themeRangeItem0 = new ThemeRangeItem();
        themeRangeItem0.setStart(-1);
        themeRangeItem0.setEnd(min);
        geoStyle.setFillForeColor(new Color(255, 243, 224, 255));//FFF3E0
        themeRangeItem0.setVisible(true);
        themeRangeItem0.setStyle(geoStyle);
        themeRange.addToHead(themeRangeItem0, true);

        List<Color> colors = getSpecialMapColors0();

        //将段 分成 colors.size()块
        int size = colors.size();

        //增量
        double block = range / size;

        for (int i = 0; i < size - 1; i++) {
            ThemeRangeItem themeRangeItem = new ThemeRangeItem();
            themeRangeItem.setStart(min);
            min += block;
            themeRangeItem.setEnd(min);
            geoStyle.setFillForeColor(colors.get(i));
            themeRangeItem.setVisible(true);
            themeRangeItem.setStyle(geoStyle);
            themeRange.addToTail(themeRangeItem, true);
        }

        ThemeRangeItem themeRangeItem = new ThemeRangeItem();
        themeRangeItem.setStart(min);
        themeRangeItem.setEnd(max + 1);
        geoStyle.setFillForeColor(colors.get(size - 1));
        themeRangeItem.setVisible(true);
        themeRangeItem.setStyle(geoStyle);
        themeRange.addToTail(themeRangeItem, true);
        Log.e(MainActivity.class.getSimpleName(), "makeTheme: rang" );

        rangLayer = mapControl.getMap().getLayers().add(dataset, themeRange, true);

        //标签专题图
        ThemeLabel themeLabel = new ThemeLabel();
        themeLabel.setLabelExpression("NAME");
        themeLabel.setRangeExpression("SmID");
        if (null != rangLayer) {
//            //标签图层
            Log.e(MainActivity.class.getSimpleName(), "makeTheme: label" );
            labelLayer = mapControl.getMap().getLayers().add(dataset, themeLabel, true);
        }
        dataset.close();
        mapControl.getMap().refresh();
        Log.e(MainActivity.class.getSimpleName(), "makeTheme: finish" );

    }

重现步骤是 多添加几次, 必然会崩溃闪退几次.

1个回答

您好,问题描述不是很清楚,麻烦描述清楚一点。

1.检查一下崩溃日志有没有其他输出信息

2.多添加几次?是重复添加还是添加新的,重复添加的化建议将之前的先清除掉再添加,防止内存溢出
9,127EXP 2019年07月08日

崩溃日志我对进程做了过滤,如下

    
    --------- beginning of crash
2019-07-08 11:14:06.148 8026-8062/com.example.themedemo A/libc: Fatal signal 8 (SIGFPE), code -6 (SI_TKILL) in tid 8062 (Thread-634), pid 8026 (ample.themedemo)
2019-07-08 11:14:06.268 8026-8026/com.example.themedemo I/ViewRootImpl: jank_removeInvalidNode jank list is null

多添加几次不是重复添加,在每次添加前将之前的移除了,移除代码如下

 //分段专题图图层
        if (null != rangLayer) {
            mapControl.getMap().getLayers().remove(rangLayer);
            rangLayer = null;
            //标签专题图层
            if (null != labelLayer) {
                mapControl.getMap().getLayers().remove(labelLayer);
                labelLayer = null;
            }
            mapControl.getMap().refresh();
        }

...