diff options
author | Tobrun <tobrun.van.nuland@gmail.com> | 2016-10-17 14:50:09 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-10-17 14:50:09 +0200 |
commit | bda0e94af2a6f6ddb7e61f2aecdf6a50479a6b32 (patch) | |
tree | 79027cfe47da4f66fed2b5b6ec316c731341e338 | |
parent | b3468f5db7101c847f17e05a8bcb830228d3b144 (diff) | |
download | qtlocation-mapboxgl-bda0e94af2a6f6ddb7e61f2aecdf6a50479a6b32.tar.gz |
MarkerView more robust when updates are asynchronous (#6717)
* [android] - remove ViewMarkers crash, show correct view cache size in test activity
* use MapboxMap to indicate a MarkerView is no longer added on a map, no future updates will be passed on to core.
* resolve memory leak
3 files changed, 21 insertions, 19 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java index 5c84fb9992..b41eebff09 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerView.java @@ -345,19 +345,23 @@ public class MarkerView extends Marker { * <p> * This method is used to instantiate the MarkerView and provide an instance of {@link com.mapbox.mapboxsdk.maps.MapboxMap.MarkerViewAdapter} * </p> + * <p> + * This method is used to notify that a MarkerView is no longer active by setting a null value. + * </p> * * @param mapboxMap the MapboxMap instances */ @Override public void setMapboxMap(MapboxMap mapboxMap) { super.setMapboxMap(mapboxMap); + if(mapboxMap!=null) { + if (isFlat()) { + // initial tilt value if MapboxMap is started with a tilt attribute + tiltValue = (float) mapboxMap.getCameraPosition().tilt; + } - if (isFlat()) { - // initial tilt value if MapboxMap is started with a tilt attribute - tiltValue = (float) mapboxMap.getCameraPosition().tilt; + markerViewManager = mapboxMap.getMarkerViewManager(); } - - markerViewManager = mapboxMap.getMarkerViewManager(); } /** diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java index fe1a48993b..ded3130715 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/annotations/MarkerViewManager.java @@ -317,6 +317,7 @@ public class MarkerViewManager { } } } + marker.setMapboxMap(null); markerViewMap.remove(marker); } @@ -390,14 +391,15 @@ public class MarkerViewManager { // remove old markers Iterator<MarkerView> iterator = markerViewMap.keySet().iterator(); while (iterator.hasNext()) { - MarkerView m = iterator.next(); - if (!markers.contains(m)) { + MarkerView marker = iterator.next(); + if (!markers.contains(marker)) { // remove marker - convertView = markerViewMap.get(m); + convertView = markerViewMap.get(marker); for (MapboxMap.MarkerViewAdapter adapter : markerViewAdapters) { - if (adapter.getMarkerClass().equals(m.getClass())) { - adapter.prepareViewForReuse(m, convertView); + if (adapter.getMarkerClass().equals(marker.getClass())) { + adapter.prepareViewForReuse(marker, convertView); adapter.releaseView(convertView); + marker.setMapboxMap(null); iterator.remove(); } } @@ -409,20 +411,14 @@ public class MarkerViewManager { if (!markerViewMap.containsKey(marker)) { for (final MapboxMap.MarkerViewAdapter adapter : markerViewAdapters) { if (adapter.getMarkerClass().equals(marker.getClass())) { + + // Inflate View convertView = (View) adapter.getViewReusePool().acquire(); final View adaptedView = adapter.getView(marker, convertView, mapView); if (adaptedView != null) { - - // tilt adaptedView.setRotationX(marker.getTilt()); - - // rotation adaptedView.setRotation(marker.getRotation()); - - // alpha adaptedView.setAlpha(marker.getAlpha()); - - // visible adaptedView.setVisibility(View.GONE); if (mapboxMap.getSelectedMarkers().contains(marker)) { @@ -448,6 +444,7 @@ public class MarkerViewManager { } }); + marker.setMapboxMap(mapboxMap); markerViewMap.put(marker, adaptedView); if (convertView == null) { adaptedView.setVisibility(View.GONE); diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MarkerViewActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MarkerViewActivity.java index 8d678794c4..fe20b75a8d 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MarkerViewActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/MarkerViewActivity.java @@ -146,7 +146,7 @@ public class MarkerViewActivity extends AppCompatActivity { public void onMapChanged(@MapView.MapChange int change) { if (change == MapView.REGION_IS_CHANGING || change == MapView.REGION_DID_CHANGE) { if (!markerViewManager.getMarkerViewAdapters().isEmpty() && viewCountView != null) { - viewCountView.setText("ViewCache size " + (mapView.getChildCount() - 5)); + viewCountView.setText("ViewCache size " + mapView.getMarkerViewContainer().getChildCount()); } } } @@ -194,6 +194,7 @@ public class MarkerViewActivity extends AppCompatActivity { protected void onStop() { super.onStop(); locationUpdateHandler.removeCallbacks(moveMarkerRunnable); + rotateUpdateHandler.removeCallbacks(rotateMarkerRunnable); } /** |