2017-07-25 93 views
0

偶爾,調用Map.setCenter時出現OutOfMemoryException。Map.setCenter有時會導致OutOfMemory崩潰

堆棧跟蹤:

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) 

我使用的是這裏的高級SDK 3.3.0

上的任何線索如何避免這種情況?

+0

當你看到這個問題時,你能夠提供一些額外的背景知道你的應用發生了什麼嗎?例如你是否在很短的時間內多次撥打「地圖」?你的應用程序中是否有多個'Map's使用?理想情況下,重現此問題的一些最小示例代碼將會有所幫助。此外,如果您可以抓住HPROF併發布可疑參考樹的屏幕截圖,這將有所幫助[HPROF查看器和分析器](https://developer.android.com/studio/profile/am-hprof.html) – AndrewJC

+0

可悲的是這隻發生在生產設備上,並通過Acra向我報告。我無法重現它。我只使用一個Map。這個「setCenter」方法在可運行任務中每調用250毫秒(跟隨車輛) – Teriblus

回答

1

這裏可能發生的情況是,您的定期任務調用setCenter()以某種方式運行時,Map未被顯示/繪製。

這些setCenter()事件添加到只刷新每個Map抽獎任務隊列,所以如果許多正在與沒有平局加稱呼它可以casue這個OOM問題。 SDK可以清除舊事件,如果它們將被新事件取消以防止這種情況發生,這是我們可以研究的事情。

在此期間,一個想法,以防止這一點,如果理論是正確的。將註冊與MapFragmentOnMapRenderListener並聽取onPostDraw()回調。您可以使用線程安全標誌(例如AtomicBoolean)來指示自您上次撥打setCenter()以來已經發生的抽獎,並且如果這是真的,則只會再次撥打setCenter()(您可以翻轉setCenterRunnable中的標誌)。

+0

謝謝,我會嘗試一下,看看我是否仍然遇到問題。 – Teriblus