summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorTobrun <tobrun@mapbox.com>2016-01-18 12:17:59 +0100
committerTobrun <tobrun@mapbox.com>2016-01-18 12:17:59 +0100
commit0ebf5fcaaee7ec90c81ed79b1ecd9843242c35c0 (patch)
tree156e34ba9f916529c915229d5d5930da462768b7 /platform
parent89b051f3865cb48fbe38a450336a6ca4517f6a07 (diff)
downloadqtlocation-mapboxgl-0ebf5fcaaee7ec90c81ed79b1ecd9843242c35c0.tar.gz
[android] #3507 - fix location listener leak in UserLocationView
Diffstat (limited to 'platform')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java47
1 files changed, 34 insertions, 13 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java
index 67dc9a3499..d0f278a521 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/UserLocationView.java
@@ -34,11 +34,13 @@ import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.location.LocationListener;
import com.mapbox.mapboxsdk.location.LocationServices;
+import java.lang.ref.WeakReference;
+
/**
* This view shows the user's location, as determined from GPS, on the map
* as a dot annotation.
*/
-final class UserLocationView extends View implements LocationListener {
+final class UserLocationView extends View {
private MapView mMapView;
@@ -85,6 +87,7 @@ final class UserLocationView extends View implements LocationListener {
private boolean mPaused = false;
private Location mUserLocation;
+ private UserLocationListener mUserLocationListener;
MapView.OnMyLocationChangeListener mOnMyLocationChangeListener;
@@ -377,14 +380,18 @@ final class UserLocationView extends View implements LocationListener {
setLocation(lastLocation);
}
+ if(mUserLocationListener==null){
+ mUserLocationListener = new UserLocationListener(this);
+ }
+
// Register for Location Updates
- locationServices.addLocationListener(this);
+ locationServices.addLocationListener(mUserLocationListener);
} else {
// Disable location and user dot
setLocation(null);
// Deregister for Location Updates
- locationServices.removeLocationListener(this);
+ locationServices.removeLocationListener(mUserLocationListener);
}
locationServices.toggleGPS(enableGps);
@@ -498,17 +505,27 @@ final class UserLocationView extends View implements LocationListener {
}
}
- /**
- * Callback method for receiving location updates from LocationServices.
- *
- * @param location The new Location data
- */
- @Override
- public void onLocationChanged(Location location) {
- if (mPaused) {
- return;
+ private static class UserLocationListener implements LocationListener{
+
+ private WeakReference<UserLocationView> mUserLocationView;
+
+ public UserLocationListener(UserLocationView userLocationView) {
+ mUserLocationView = new WeakReference<>(userLocationView);
+ }
+
+
+ /**
+ * Callback method for receiving location updates from LocationServices.
+ *
+ * @param location The new Location data
+ */
+ @Override
+ public void onLocationChanged(Location location) {
+ UserLocationView locationView = mUserLocationView.get();
+ if(locationView!=null && !locationView.isPaused()){
+ locationView.setLocation(location);
+ }
}
- setLocation(location);
}
private boolean isStale(Location location) {
@@ -751,4 +768,8 @@ final class UserLocationView extends View implements LocationListener {
}
}
+ public boolean isPaused(){
+ return mPaused;
+ }
+
}