summaryrefslogtreecommitdiff
path: root/platform/android
diff options
context:
space:
mode:
authorTobrun <tobrun@mapbox.com>2016-05-04 12:27:48 +0200
committerTobrun <tobrun@mapbox.com>2016-05-20 12:00:02 +0200
commitb7d47d4c3fd038d4a6e92cdd65b76fb6bd435a33 (patch)
treeaab988a163b973eab85d978d32c6022e7a2cc860 /platform/android
parentc53533270bd619f853cd4e1cae8a8730f1fe9f7d (diff)
downloadqtlocation-mapboxgl-b7d47d4c3fd038d4a6e92cdd65b76fb6bd435a33.tar.gz
[android] #3276 - using a pool to do view reuse
Diffstat (limited to 'platform/android')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java80
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java33
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerActivity.java8
3 files changed, 94 insertions, 27 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java
index 5807bc53ce..5cf09184c0 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java
@@ -94,9 +94,11 @@ import java.lang.annotation.RetentionPolicy;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
/**
@@ -155,8 +157,9 @@ public class MapView extends FrameLayout {
private StyleInitializer mStyleInitializer;
private List<OnMapReadyCallback> mOnMapReadyCallbackList;
- private long nViewMarkerBoundsUpdateTime;
-
+ private long mViewMarkerBoundsUpdateTime;
+ private boolean mViewMarkersUpdateRunning;
+
@UiThread
public MapView(@NonNull Context context) {
super(context);
@@ -455,12 +458,11 @@ public class MapView extends FrameLayout {
long currentTime = SystemClock.elapsedRealtime();
- if (currentTime < nViewMarkerBoundsUpdateTime) {
+ if (mViewMarkersUpdateRunning || currentTime < mViewMarkerBoundsUpdateTime) {
return;
}
-
- nViewMarkerBoundsUpdateTime = currentTime + 300;
-
+
+ mViewMarkerBoundsUpdateTime = currentTime + 300;
new MarkerInBoundsTask().execute();
}
}
@@ -475,14 +477,24 @@ public class MapView extends FrameLayout {
}
}
- private class MarkerInBoundsTask extends AsyncTask<Void, Void, Void>{
+
+ public class MarkerInBoundsTask extends AsyncTask<Void, Void, MarkerInBoundsTask.Result> {
+
+ @Override
+ protected void onPreExecute() {
+ super.onPreExecute();
+ mViewMarkersUpdateRunning = true;
+ }
+
@Override
- protected Void doInBackground(Void... params) {
+ protected Result doInBackground(Void... params) {
+ List<Marker> inBounds = new ArrayList<>();
+ Map<Marker, View> outBounds = new HashMap<>();
+
LatLngBounds bounds = mMapboxMap.getProjection().getVisibleRegion().latLngBounds;
long[] ids = mNativeMapView.getAnnotationsInBounds(bounds);
LongSparseArray<View> markerViews = mMapboxMap.getMarkerViews();
-
- MapboxMap.MarkerViewAdapter adapter = mMapboxMap.getMarkerViewAdapter();
+ Log.v(MapboxConstants.TAG, "Annotations in bounds: " + ids.length);
boolean found;
long key;
@@ -499,11 +511,12 @@ public class MapView extends FrameLayout {
}
if (!found) {
- Log.v(MapboxConstants.TAG, "Adding " + id);
-// if(adapter!=null) {
-// mMapboxMap.addMarkerView(id, adapter.getView((Marker) mMapboxMap.getAnnotation(id), null, MapView.this));
-// }
- markerViews.append(id, null);
+ Annotation annotation = mMapboxMap.getAnnotation(id);
+ if (annotation instanceof Marker) {
+ inBounds.add((Marker) annotation);
+ } else {
+ Log.v(MapboxConstants.TAG, "Not instance of Marker" + id);
+ }
} else {
Log.v(MapboxConstants.TAG, "Already added " + id);
}
@@ -519,13 +532,42 @@ public class MapView extends FrameLayout {
}
}
if (!found) {
- Log.v(MapboxConstants.TAG, "Removing " + key);
- markerViews.remove(key);
+ Annotation annotation = mMapboxMap.getAnnotation(key);
+ if (annotation instanceof Marker) {
+ outBounds.put((Marker) annotation, markerViews.get(key));
+ } else {
+ Log.v(MapboxConstants.TAG, "Not instance of Marker" + key);
+ }
}
}
- Log.v(MapboxConstants.TAG, "Amount of annotations: " + markerViews.size());
- return null;
+ return new Result(inBounds, outBounds);
+ }
+
+ @Override
+ protected void onPostExecute(Result result) {
+ super.onPostExecute(result);
+ mMapboxMap.setViewMarkersBoundsTaskResult(result);
+ mViewMarkersUpdateRunning = false;
+ Log.v(MapboxConstants.TAG, "Amount of child views " + getChildCount());
+ }
+
+ public class Result {
+ private List<Marker> inBounds;
+ private Map<Marker, View> outBounds;
+
+ public Result(List<Marker> inBounds, Map<Marker, View> outBounds) {
+ this.inBounds = inBounds;
+ this.outBounds = outBounds;
+ }
+
+ public List<Marker> getInBounds() {
+ return inBounds;
+ }
+
+ public Map<Marker, View> getOutBounds() {
+ return outBounds;
+ }
}
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
index 822572298d..f428df3035 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java
@@ -3,12 +3,15 @@ package com.mapbox.mapboxsdk.maps;
import android.content.Context;
import android.graphics.Bitmap;
import android.location.Location;
+import android.os.Handler;
+import android.os.Looper;
import android.os.SystemClock;
import android.support.annotation.FloatRange;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
import android.support.v4.util.LongSparseArray;
+import android.support.v4.util.Pools;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
@@ -41,6 +44,7 @@ import com.mapbox.mapboxsdk.maps.widgets.MyLocationViewSettings;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
@@ -89,6 +93,8 @@ public class MapboxMap {
private double mMaxZoomLevel = -1;
private double mMinZoomLevel = -1;
+ private Pools.SimplePool<View> viewSimplePool = new Pools.SimplePool<>(20);
+
MapboxMap(@NonNull MapView mapView) {
mMapView = mapView;
mMapView.addOnMapChangedListener(new MapChangeCameraPositionListener());
@@ -631,9 +637,29 @@ public class MapboxMap {
// Annotations
//
- public void addMarkerView(long key, View markerView) {
- mMarkerViews.append(key, markerView);
- mMapView.addView(markerView);
+ void setViewMarkersBoundsTaskResult(MapView.MarkerInBoundsTask.Result result) {
+ Map<Marker, View> outBoundsMarker = result.getOutBounds();
+ View convertView;
+ for (Map.Entry<Marker, View> outBoundsEntry : outBoundsMarker.entrySet()) {
+ convertView = outBoundsEntry.getValue();
+ if (convertView != null) {
+ convertView.setVisibility(View.GONE);
+ viewSimplePool.release(convertView);
+ mMarkerViews.remove(outBoundsEntry.getKey().getId());
+ }
+ }
+
+ List<Marker> inBoundsMarkers = result.getInBounds();
+ for (Marker marker : inBoundsMarkers) {
+ convertView = viewSimplePool.acquire();
+ View adaptedView = mMarkerViewAdapter.getView(marker, convertView, mMapView);
+ mMarkerViews.append(marker.getId(), adaptedView);
+ if (convertView == null) {
+ mMapView.addView(adaptedView);
+ } else {
+ convertView.setVisibility(View.VISIBLE);
+ }
+ }
}
/**
@@ -984,7 +1010,6 @@ public class MapboxMap {
*
* @return An annotation with a matched id, null is returned if no match was found.
*/
- @UiThread
@Nullable
public Annotation getAnnotation(long id) {
return mAnnotations.get(id);
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerActivity.java
index 1a980cd571..7467d2993d 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerActivity.java
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/ViewMarkerActivity.java
@@ -52,10 +52,10 @@ public class ViewMarkerActivity extends AppCompatActivity implements OnMapReadyC
@Override
public void onMapReady(MapboxMap mapboxMap) {
List<BaseMarkerOptions> countries = new ArrayList<>();
- countries.add(new CountryMarkerOptions().abbrevName("ch").flagRes(R.drawable.ic_china).position(new LatLng(31.230416, 121.473701)));
- countries.add(new CountryMarkerOptions().abbrevName("us").flagRes(R.drawable.ic_us).position(new LatLng(38.907192, -77.036871)));
- countries.add(new CountryMarkerOptions().abbrevName("br").flagRes(R.drawable.ic_brazil).position(new LatLng(-15.798200, -47.922363)));
- countries.add(new CountryMarkerOptions().abbrevName("de").flagRes(R.drawable.ic_germany).position(new LatLng(52.520007, 13.404954)));
+ countries.add(new CountryMarkerOptions().title("China").abbrevName("ch").flagRes(R.drawable.ic_china).position(new LatLng(31.230416, 121.473701)));
+ countries.add(new CountryMarkerOptions().title("United States").abbrevName("us").flagRes(R.drawable.ic_us).position(new LatLng(38.907192, -77.036871)));
+ countries.add(new CountryMarkerOptions().title("Brazil").abbrevName("br").flagRes(R.drawable.ic_brazil).position(new LatLng(-15.798200, -47.922363)));
+ countries.add(new CountryMarkerOptions().title("Germany").abbrevName("de").flagRes(R.drawable.ic_germany).position(new LatLng(52.520007, 13.404954)));
mapboxMap.addMarkers(countries);
mapboxMap.setMarkerViewAdapter(new CountryAdapter(this));