Map.setCenter有时会导致OutOfMemory崩溃

时间:2017-07-25 12:06:48

标签: android here-api

偶尔,我在调用Map.setCenter时会出现OutOfMemoryException。

堆栈追踪:

java.lang.OutOfMemoryError
at java.util.concurrent.CopyOnWriteArrayList.add(CopyOnWriteArrayList.java:267)
at com.nokia.maps.MapImpl.a(MapImpl.java:587)
at com.nokia.maps.MapImpl.a(MapImpl.java:2939)
at com.here.android.mpa.mapping.Map.setCenter(Map.java:865)
at com.cirrios.smartnavigationlib.ui.MapController$1.run(MapController.java:84)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:801)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:617)
at dalvik.system.NativeStart.main(Native Method)

我使用Here Premium SDK v3.3.0

有关如何防止这种情况的任何线索?

1 个答案:

答案 0 :(得分:1)

这里可能发生的事情是,在setCenter()没有显示/绘制的时候,调用Map的定期任务会以某种方式运行。

这些setCenter()事件被添加到任务队列中,该任务队列仅在每次Map绘制时刷新,因此如果添加许多事件没有绘制调用,则可能会导致此OOM问题。 SDK可以清除旧事件,如果它们被新的事件取消以防止这种情况,我们可以调查它。

与此同时,如果理论正确的话,一个想法就是在OnMapRenderListener注册MapFragment并监听onPostDraw()回调。您可以使用线程安全标记(例如AtomicBoolean)来表示自上次setCenter()调用以来已经发生了抽奖,如果这是真的,则只能再次调用setCenter()(您可以在您的setCenter Runnable)。