microg / GmsCore

Free implementation of Play Services
https://microg.org
Apache License 2.0
8.28k stars 1.7k forks source link

Exception while scrolling around a map #94

Closed K-Wic closed 8 years ago

K-Wic commented 8 years ago

Hi, I am trying to use the app MVG more (for bike and car sharing in Munich) and it is mostly working fine. However when I scroll around the map too fast/excessively I get an exception.

The exception actually occurs in the vtm library, so this report might not belong here, but I traced the immediate cause back to a call from gms.

This is what logcat shows me:

D/GmsMapMarkerImpl(29927): New marker m241 with title null @ lat/lng: (48.13603973388672,11.542187690734863)
D/BitmapDescriptor(29927): Start loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@1363194e
D/BitmapDescriptor(29927): Done loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@1363194e
D/BitmapDescriptor(29927): Start loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@f738e8b
D/BitmapDescriptor(29927): Done loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@f738e8b
D/BitmapDescriptor(29927): Start loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@20a8867
E/AndroidRuntime(29927): FATAL EXCEPTION: Thread-5242
E/AndroidRuntime(29927): Process: de.mvg.more, PID: 29927
E/AndroidRuntime(29927): java.lang.NullPointerException: Attempt to invoke virtual method 'org.oscim.core.GeoPoint org.oscim.layers.marker.MarkerItem.getPoint()' on a null object reference
E/AndroidRuntime(29927):        at org.oscim.layers.marker.MarkerRenderer.populate(MarkerRenderer.java:182)
E/AndroidRuntime(29927):        at org.oscim.layers.marker.MarkerLayer.populate(MarkerLayer.java:66)
E/AndroidRuntime(29927):        at org.oscim.layers.marker.ItemizedLayer.addItem(ItemizedLayer.java:75)
E/AndroidRuntime(29927):        at org.microg.gms.maps.BackendMap.update(BackendMap.java:175)
E/AndroidRuntime(29927):        at org.microg.gms.maps.GoogleMapImpl.update(GoogleMapImpl.java:310)
E/AndroidRuntime(29927):        at org.microg.gms.maps.markup.MarkerImpl$1.run(MarkerImpl.java:249)
E/AndroidRuntime(29927):        at org.microg.gms.maps.bitmap.BitmapDescriptorImpl$1.run(BitmapDescriptorImpl.java:84)
E/AndroidRuntime(29927):        at java.lang.Thread.run(Thread.java:818)
W/ActivityManager(  594):   Force finishing activity 1 de.mvg.more/de.swm.mvgrad.activities.MainActivity
W/DropBoxManagerService(  594): Dropping: data_app_crash (877 > 0 bytes)
D/GmsLocManagerSvcImpl( 1491): updateLocationRequest: LocationRequestUpdateData{opCode=2, request=null, listener=com.google.android.gms.location.ILocationListener$Stub$Proxy@28934f5f, pendingIntent=null, callback=null}
D/GmsLocProviderReal( 1491): gps: removeRequest LocationRequestHelper{locationRequest=LocationRequest{priority=100, interval=1500, fastestInterval=250, explicitFastestInterval=false, expirationTime=9223372036854775807, numUpdates=2147483647, smallestDesplacement=0.0, maxWaitTime=0}, hasFinePermission=true, hasCoarsePermission=true, packageName='null', lastReport=null}

The problem seems to lie with the following lines in play-services-core/src/main/java/org/microg/gms/maps/BackendMap.java:171

   public synchronized void update(Markup markup) {
        if (markup == null) return;
        if (markup instanceof MarkerItemMarkup) {
            mapView.items().removeItem(mapView.items().getByUid(markup.getId()));
            mapView.items().addItem(((MarkerItemMarkup) markup).getMarkerItem(context));
        } else if (markup instanceof DrawableMarkup) {
            updateDrawableLayer();
            mapView.drawables().update();
        }
        redraw();
    }

The getMarkerItem-method returns null, which eventually leads to an exception. In my search for the reason I added some output to MakerImpl.getMarkerItem and MarkerImpl.remove. The log now shows this:

D/BitmapDescriptor(31974): Done loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@25211c91
D/BitmapDescriptor(31974): Start loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@2f6207f7
D/BitmapDescriptor(31974): Done loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@2f6207f7
D/BitmapDescriptor(31974): Start loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@23b14c01
D/BitmapDescriptor(31974): Start loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@16bdaa6
D/BitmapDescriptor(31974): Done loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@23b14c01
D/BitmapDescriptor(31974): Done loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@16bdaa6
D/GmsMapMarkerImpl(31974): Removing m855
D/GmsMapMarkerImpl(31974): java.lang.Exception
D/GmsMapMarkerImpl(31974):      at org.microg.gms.maps.markup.MarkerImpl.remove(MarkerImpl.java:60)
D/GmsMapMarkerImpl(31974):      at com.google.android.gms.maps.model.internal.IMarkerDelegate$Stub.onTransact(IMarkerDelegate.java:48)
D/GmsMapMarkerImpl(31974):      at android.os.Binder.transact(Binder.java:380)
D/GmsMapMarkerImpl(31974):      at com.google.android.gms.maps.model.internal.g.a(Unknown Source)
D/GmsMapMarkerImpl(31974):      at com.google.android.gms.maps.model.Marker.a(Unknown Source)
D/GmsMapMarkerImpl(31974):      at de.swm.mvgrad.fragments.MapFragment.insertOrUpdateMarkers(MapFragment.java:852)
D/GmsMapMarkerImpl(31974):      at de.swm.mvgrad.fragments.MapFragment.showMarkers(MapFragment.java:585)
D/GmsMapMarkerImpl(31974):      at de.swm.mvgrad.presenters.MapPresenter.createMarkersAndNotifyView(MapPresenter.java:314)
D/GmsMapMarkerImpl(31974):      at de.swm.mvgrad.presenters.MapPresenter.access$300(MapPresenter.java:42)
D/GmsMapMarkerImpl(31974):      at de.swm.mvgrad.presenters.MapPresenter$9.onNext(MapPresenter.java:269)
D/GmsMapMarkerImpl(31974):      at de.swm.mvgrad.presenters.MapPresenter$9.onNext(MapPresenter.java:264)
D/GmsMapMarkerImpl(31974):      at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:130)
D/GmsMapMarkerImpl(31974):      at rx.internal.operators.bc.c(OperatorObserveOn.java:208)
D/GmsMapMarkerImpl(31974):      at rx.internal.operators.bc$2.call(OperatorObserveOn.java:170)
D/GmsMapMarkerImpl(31974):      at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
D/GmsMapMarkerImpl(31974):      at android.os.Handler.handleCallback(Handler.java:739)
D/GmsMapMarkerImpl(31974):      at android.os.Handler.dispatchMessage(Handler.java:95)
D/GmsMapMarkerImpl(31974):      at android.os.Looper.loop(Looper.java:135)
D/GmsMapMarkerImpl(31974):      at android.app.ActivityThread.main(ActivityThread.java:5292)
D/GmsMapMarkerImpl(31974):      at java.lang.reflect.Method.invoke(Native Method)
D/GmsMapMarkerImpl(31974):      at java.lang.reflect.Method.invoke(Method.java:372)
D/GmsMapMarkerImpl(31974):      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
D/GmsMapMarkerImpl(31974):      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
D/BitmapDescriptor(31974): Start loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@5d4ba5c
D/BitmapDescriptor(31974): Start loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@166fde3a
D/BitmapDescriptor(31974): Start loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@28212048
D/BitmapDescriptor(31974): Done loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@166fde3a
D/BitmapDescriptor(31974): Done loading org.microg.gms.maps.bitmap.ResourceBitmapDescriptor@28212048
I/GmsMapMarkerImpl(31974): Returning removed item m855
E/AndroidRuntime(31974): FATAL EXCEPTION: Thread-16814
E/AndroidRuntime(31974): Process: de.mvg.more, PID: 31974
E/AndroidRuntime(31974): java.lang.NullPointerException: Attempt to invoke virtual method 'org.oscim.core.GeoPoint org.oscim.layers.marker.MarkerItem.getPoint()' on a null object reference
E/AndroidRuntime(31974):        at org.oscim.layers.marker.MarkerRenderer.populate(MarkerRenderer.java:182)
E/AndroidRuntime(31974):        at org.oscim.layers.marker.MarkerLayer.populate(MarkerLayer.java:66)
E/AndroidRuntime(31974):        at org.oscim.layers.marker.ItemizedLayer.addItem(ItemizedLayer.java:75)
E/AndroidRuntime(31974):        at org.microg.gms.maps.BackendMap.update(BackendMap.java:175)
E/AndroidRuntime(31974):        at org.microg.gms.maps.GoogleMapImpl.update(GoogleMapImpl.java:310)
E/AndroidRuntime(31974):        at org.microg.gms.maps.markup.MarkerImpl$1.run(MarkerImpl.java:253)
E/AndroidRuntime(31974):        at org.microg.gms.maps.bitmap.BitmapDescriptorImpl$1.run(BitmapDescriptorImpl.java:84)
E/AndroidRuntime(31974):        at java.lang.Thread.run(Thread.java:818)
W/ActivityManager(  594):   Force finishing activity 1 de.mvg.more/de.swm.mvgrad.activities.MainActivity
W/DropBoxManagerService(  594): Dropping: data_app_crash (877 > 0 bytes)
D/GmsLocManagerSvcImpl(31618): updateLocationRequest: LocationRequestUpdateData{opCode=2, request=null, listener=com.google.android.gms.location.ILocationListener$Stub$Proxy@1246606c, pendingIntent=null, callback=null}

So it seems that the item is first removed and then added to the map. Since I know nothing about the maps API, there might be a more basic problem then adding a null item, but checking for that solved the problem for me:

diff --git a/play-services-core/src/main/java/org/microg/gms/maps/BackendMap.java b/play-services-core/src/main/java/org/microg/gms/maps/BackendMap.java
index cd9c555..dab8dcf 100644
--- a/play-services-core/src/main/java/org/microg/gms/maps/BackendMap.java
+++ b/play-services-core/src/main/java/org/microg/gms/maps/BackendMap.java
@@ -172,7 +172,9 @@ public class BackendMap implements ItemizedLayer.OnItemGestureListener<MarkerIte
         if (markup == null) return;
         if (markup instanceof MarkerItemMarkup) {
             mapView.items().removeItem(mapView.items().getByUid(markup.getId()));
-            mapView.items().addItem(((MarkerItemMarkup) markup).getMarkerItem(context));
+            MarkerItem itm = ((MarkerItemMarkup) markup).getMarkerItem(context);
+            if (itm == null) return;
+            mapView.items().addItem(itm);
         } else if (markup instanceof DrawableMarkup) {
             updateDrawableLayer();
             mapView.drawables().update();

I hope this helps to fix the issue. If anyone thinks that it should be handled more robustly on the vtm side, I will also add a bugreport there.

mar-v-in commented 8 years ago

Thanks, should be fixed in latest nightly.