首页 / 浏览问题 / 移动GIS / 问题详情
imobile1001 android 三维模型滑动、缩放时经常卡死闪退
4EXP 2020年04月16日

使用产品 :imobile1001

设备:小米10pro  Android 10

模型格式:OSGB

问题描述:这个月刚更换的1001版本 ,之前用的是9.11,现在打开模型后经常在滑动过程中出现卡顿  卡死   闪退;有没有supermap iearth的代码

重现步骤:1 打开模型 2 手势滑动。

下图为错误发生时的日志

1001的lib包

1个回答

您好,在9d版本中使用同一份数据会出现上诉说的问题吗?如果可以的话可以私信我一份你们的数据
9,197EXP 2020年04月16日

刚刚换成9d版本也会出现这样的问题,模型会卡在那里自己放大缩小,放大缩小,缩放幅度不大,但是一会儿就闪退了。

这是我手势处理的代码。

switch (event.getAction() & MotionEvent.ACTION_MASK) {
////                case MotionEvent.ACTION_UP:
////                    Layer3Ds layer3ds = m_sceneControl.getScene().getLayers();
////                    int count = layer3ds.getCount();
////                    if(firstOpen){
////                        for (int i = 0; i < count; i++) {
////                            ((Layer3DOSGBFile) layer3ds.get(i)).setLODRangeScale(0.1);
////                        }
////                    }
////                    for (int i = 0; i < count; i++) {
////                        Layer3D layer = layer3ds.get(i);
////                        if (layer == null) {
////                            continue;
////                        }
////                        final Selection3D selection = layer.getSelection();
////                        if (selection == null) {
////                            continue;
////                        }
////                        if (layer.getName() == null) {
////                            continue;
////                        }
////                        FieldInfos fieldInfos = layer.getFieldInfos();
////                        vect(selection, layer, fieldInfos);
////                        // 获取选择集中对象的总数
////                        if (selection.getCount() > 0) {
////                            // 返回选择集中指定几何对象的系统 ID          // 本地数据获取
////                            int layerId = -1;
////                            try{
////                                layerId = layersMap.get(layer.getName());
////                            }catch (Exception e){
////                                showToast("未在图层列表中找到该构件");
////                                return false;
////                            }
////                            if(viewPagerDialog == null){
////                                viewPagerDialog = ViewPagerDialog.getInstance(getActivity(), 0, String.valueOf(layerId), SmID, qualitylist, safetylist, cmptFilesList);
////                            }else{
////                                if(!TextUtils.isEmpty(String.valueOf(layerId)) && !TextUtils.isEmpty(SmID)){
////                                    viewPagerDialog.setLayerId(String.valueOf(layerId));
////                                    viewPagerDialog.setSmID(SmID);
////                                }else{
////                                    return false;
////                                }
////                            }
////                            viewPagerDialog.show();
////                        }
////                    }
////
////                    break;
////                case MotionEvent.ACTION_DOWN:
////                    Layer3Ds layer3ds1 = m_sceneControl.getScene().getLayers();
////                    int count1 = layer3ds1.getCount();
////                    for (int i = 0; i < count1; i++) {
////                        Layer3D layer = layer3ds1.get(i);
////                        Selection3D selection = layer.getSelection();
////                        selection.clear();
////                    }
////                    break;
////                default:
////                    break;
////            }
//            return false;

我看你的手势监听里面写的都是按下和抬起的监听,你看一下您的手势监听是不是存在死循环,,把手势监听注释掉看一下
我试了下去掉监听确实没再浮现这个问题。

但是这个监听是为了获取构件属性才加的,有没有好的解决方法?
调试一下代码,看一下是在监听的哪一句代码卡住了。获取构件属性可以参考我们的示范demo;安装目录\SampleCode\OSGBLayerAttributeQuery

我把代码替换成demo中的touch事件,只要底部弹出框弹出一次,以后的每次滑动事件弹出框都会弹出。

换成这个touch事件后,还是在滑动时有卡顿甚至崩溃。

ps:在应用商店上架的supermap iearth不会出现这些问题。那个的代码能发一下吗?

如果把selection每次清空,则不会标注哪个控件。

以下是事件处理

    // 通过touch监听获取点击事件
    class SceneTouchListener implements View.OnTouchListener {
        @Override
        public boolean onTouch(View v, final MotionEvent event) {


            Layer3Ds layer3ds = m_sceneControl.getScene().getLayers();
            // 返回给定的三维图层集合中三维图层对象的总数。
            int count = layer3ds.getCount();
            if (count > 0) {
                for (int i = 0; i < count; i++) {
                    Layer3D layer = layer3ds.get(i);
                    // 遍历count之后,得到三维图层对象 // 返回三维图层的选择集。
                    if (layer == null) {
                        continue;
                    }
                    selection = layer.getSelection();
                    if (selection == null) {
                        continue;
                    }
                    if (layer.getName() == null) {
                        continue;
                    }
                    // 获取选择集中对象的总数
                    if (selection.getCount() > 0) {
                        // 返回选择集中指定几何对象的系统 ID
                        // 本地数据获取
                        queryInfoBubblePopupWindow.m_QueryInfoData.clear();
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                queryInfoBubblePopupWindow.show(m_sceneControl, event.getX(), event.getY());
                            }
                        });
                    }
                    FieldInfos fieldInfos = layer.getFieldInfos();
                    vect(selection, layer, fieldInfos, queryInfoBubblePopupWindow);
                }

            }
            return false;
}

可能是在滑动的时候造成你的touch事件一直在执行,导致内存泄漏崩掉。你可以尝试设置用户手势识别器, setGestureDetector(android.view.GestureDetector gsDetector),通过里面的长按事件或者ondown事件来执行属性的查询。您的这个情况就是代码逻辑上的问题,可以调试一下代码看是卡在哪个位置,是不是每次滑动都会执行你的事件。不好意思,iearth的代码目前没有开源,没法发给您

您好,非常感谢您积极帮我解决问题。

现在我遇到了一个新的问题:

工具: imobile1001 

对比操作工具: 华为m5(Android 9)      小米10 pro(Android 10) 华为p30 pro(Android 10

问题描述:更换osgb模型,全部加载s3m的模型,在使用相同的代码情况下,华为m5、小米10 pro和华为p30 pro点击事件无效,无变色、无反应。

以下为代码片段

    // 通过touch监听获取点击事件
    class SceneTouchListener implements View.OnTouchListener {
        @Override
        public boolean onTouch(View v, final MotionEvent event) {

            switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_UP:
                    Layer3Ds layer3ds = m_sceneControl.getScene().getLayers();
                    int count = layer3ds.getCount();
//                    if(firstOpen){
//                        for (int i = 0; i < count; i++) {
//                            ((Layer3DOSGBFile) layer3ds.get(i)).setLODRangeScale(0.1);
//                        }
//                    }
                    for (int i = 0; i < count; i++) {
                        Layer3D layer = layer3ds.get(i);
                        if (layer == null) {
                            continue;
                        }
                        final Selection3D selection = layer.getSelection();
                        if (selection == null) {
                            continue;
                        }
                        if (layer.getName() == null) {
                            continue;
                        }
                        FieldInfos fieldInfos = layer.getFieldInfos();
                        vect(selection, layer, fieldInfos);
                        // 获取选择集中对象的总数
                        if (selection.getCount() > 0) {
                            // 返回选择集中指定几何对象的系统 ID          // 本地数据获取
                            int layerId = -1;
                            try{
                                layerId = layersMap.get(layer.getName());
                            }catch (Exception e){
                                showToast("未在图层列表中找到该构件");
                                return false;
                            }
                            if(viewPagerDialog == null){
                                viewPagerDialog = ViewPagerDialog.getInstance(getActivity(), 0, String.valueOf(layerId), SmID, qualitylist, safetylist, cmptFilesList);
                            }else{
                                if(!TextUtils.isEmpty(String.valueOf(layerId)) && !TextUtils.isEmpty(SmID)){
                                    viewPagerDialog.setLayerId(String.valueOf(layerId));
                                    viewPagerDialog.setSmID(SmID);
                                }else{
                                    return false;
                                }
                            }
                            viewPagerDialog.show();
                        }
                    }

                    break;
                case MotionEvent.ACTION_DOWN:
                    Layer3Ds layer3ds1 = m_sceneControl.getScene().getLayers();
                    int count1 = layer3ds1.getCount();
                    for (int i = 0; i < count1; i++) {
                        Layer3D layer = layer3ds1.get(i);
                        Selection3D selection = layer.getSelection();
                        selection.clear();
                    }
                    break;
                default:
                    break;
            }
            return false;
        }

...