偶尔,我在调用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
有关如何防止这种情况的任何线索?
答案 0 :(得分:1)
这里可能发生的事情是,在setCenter()
没有显示/绘制的时候,调用Map
的定期任务会以某种方式运行。
这些setCenter()
事件被添加到任务队列中,该任务队列仅在每次Map
绘制时刷新,因此如果添加许多事件没有绘制调用,则可能会导致此OOM问题。 SDK可以清除旧事件,如果它们被新的事件取消以防止这种情况,我们可以调查它。
与此同时,如果理论正确的话,一个想法就是在OnMapRenderListener
注册MapFragment
并监听onPostDraw()
回调。您可以使用线程安全标记(例如AtomicBoolean
)来表示自上次setCenter()
调用以来已经发生了抽奖,如果这是真的,则只能再次调用setCenter()
(您可以在您的setCenter
Runnable
)。