首页 / 浏览问题 / 移动GIS / 问题详情
关于Geometry3D子类的资源回收问题
19EXP 2021年04月21日
使用产品:supermap-imobile-10.1.2-220-android-zip-chs_(精简绿色包)

操作系统:Android(Redmi 5 Plus,MIUI 11.0.3)

问题详细描述:

现需要在三维场景中使用代码进行点、线、面、文字标注等的绘制,已通过往SceneControl.scene.trackingLayer中添加Geometry3D相应子类实现。

根据文档描述,图形对象的回收使用Geometry3D.dispose()方法完成。我这边回收资源的实现逻辑是,遍历SceneControl.scene.trackingLayer中的每一个对象,并调用其dispose()方法,然后清空SceneControl.scene.trackingLayer列表。通过重复创建Geometry3D子类对象然后回收的方法,并结合Android Profiler工具进行内存分析,发现:

1、点(GeoPoint3D)、线(GeoLine3D)、面(GeoRegion3D)图形对象可在SceneControl.scene.trackingLayer遍历到,调用其dispose()方法无异常,但内存并未减少

2、文字标注(GeoText3D)无法在SceneControl.scene.trackingLayer遍历到,发生异常错误:java.lang.NullPointerException: Attempt to invoke virtual method 'void com.supermap.data.InternalHandleDisposable.setIsDisposable(boolean)' on a null object reference

3、清空SceneControl.scene.trackingLayer列表后,内存并未减少

请问如何正确地回收Geometry3D子类对象的资源?

1个回答

您好,回收几何对象就是使用geometry.dispose()方法回收资源。你们那边是资源占用很多吗?文字标注GeoText3D无法遍历,你看下TrackingLayer3D里面几何对象个数 是否正常,看一下直接通过索引获取几何对象能否正常获取 成功。
9,127EXP 2021年04月21日
你好!

TrackingLayer3D里面的Geometry对象个数是正确的。

直接通过索引的方式,可以访问到点(GeoPoint3D)、线(GeoLine3D)、面(GeoRegion3D)图形对象,但是索引到文字标注(GeoText3D)的时候,报错了,即问题中提到的异常:java.lang.NullPointerException: Attempt to invoke virtual method 'void com.supermap.data.InternalHandleDisposable.setIsDisposable(boolean)' on a null object reference。

在发现了这个异常后,我就做了内存回收情况的压力测试。结果发现,因为文字标注(GeoText3D)没法索引到,内存一直在增加。

后来我专门用个ArrayList来缓存这些文字标注(GeoText3D),以便在回收方法中调用这些文字标注(GeoText3D)的dispose()方法,结果发现这个dispose()方法并没有作用,内存一直在增加。

同样地,我也做了点(GeoPoint3D)、线(GeoLine3D)、面(GeoRegion3D)图形对象的内存回收情况的压力测试。结果是,内存也是在一直增长,只是情况没有文字标注(GeoText3D)的严重。
您好,我这边重现了您的问题,我这边上报一个缺陷,然后跟研发反馈下,解决后回复您
您好,研发正在处理。预计两周时间修改缺陷。
...