2017-07-25 4 views
0

Hin und wieder OutOfMemoryException beim Aufruf von Map.setCenter.Map.setCenter verursacht manchmal OutOfMemory Abstürze

Stack Trace:

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) 

I v3.3.0 Hier Premium-SDK bin

keine Ahnung, wie dies zu verhindern?

+0

Wären Sie in der Lage, einen zusätzlichen Kontext für die Vorgänge in Ihrer App bereitzustellen, wenn dieses Problem auftritt? z.B. Machst du in kurzer Zeit viele Anrufe auf der "Karte"? Haben Sie mehrere Karten in Ihrer Anwendung? Im Idealfall wäre ein minimaler Beispielcode hilfreich, um dieses Problem zu reproduzieren. Auch, wenn Sie ein HPROF greifen und einen Screenshot des verdächtigen Referenzbaums hochladen könnten, wäre es hilfreich [HPROF Viewer and Analyzer] (https://developer.android.com/studio/profile/am-hprof.html) – AndrewJC

+0

Leider Dies geschah nur auf Produktionsgeräten und wurde mir über Acra gemeldet. Ich kann es nicht reproduzieren. Ich benutze nur eine Karte. Diese "setCenter" -Methode wird alle 250 Millisekunden in einer lauffähigen Aufgabe aufgerufen (um dem Fahrzeug zu folgen) – Teriblus

Antwort

1

Es ist möglich, was passiert hier ist, dass Ihre periodische Aufgabe setCenter() zu einer Zeit läuft, wenn die Map wird nicht angezeigt/gezeichnet wird.

Diese setCenter()-Ereignisse werden zu einer Aufgabenwarteschlange hinzugefügt, die nur bei jeder Map-Zeichnung geleert wird. Wenn also viele Personen ohne Zeichnungsaufruf hinzugefügt werden, kann dieses OOM-Problem auftreten. Das SDK könnte alte Ereignisse löschen, wenn sie durch neue gelöscht werden, um dies zu verhindern. Das können wir uns ansehen.

In der Zwischenzeit, eine Idee, dies zu verhindern, wenn die Theorie korrekt ist, wäre eine OnMapRenderListener mit der MapFragment registrieren und für onPostDraw() Rückrufe zu hören. Sie können ein threadsicheres Flag (z. B. AtomicBoolean) verwenden, um anzugeben, dass eine Verlosung seit Ihrem letzten setCenter()-Aufruf stattgefunden hat, und nur setCenter() erneut aufrufen, wenn dies zutrifft (Sie würden das Flag in Ihrem setCenterRunnable umdrehen).

+0

Danke, ich werde das versuchen und sehen, ob ich das Problem noch bekomme. – Teriblus

Verwandte Themen