summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapSettings.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapSettings.java')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapSettings.java36
1 files changed, 36 insertions, 0 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapSettings.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapSettings.java
index 8a64937bf4..6b7c055c7d 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapSettings.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapSettings.java
@@ -1,7 +1,10 @@
package com.mapbox.mapboxsdk.maps;
+import android.arch.lifecycle.LifecycleOwner;
+import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.MutableLiveData;
import android.arch.lifecycle.ViewModel;
+import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
@@ -9,6 +12,12 @@ import android.text.TextUtils;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.constants.Style;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import timber.log.Timber;
+
/**
* Internal class used to manage map settings.
*/
@@ -119,4 +128,31 @@ public final class MapSettings extends ViewModel {
public void setApiBaseUrl(String apiBaseUrl) {
this.apiBaseUrl.setValue(apiBaseUrl);
}
+
+ void onMapDestroy(@NonNull Context context) {
+ clearObservers((LifecycleOwner) context);
+ }
+
+ private void clearObservers(@NonNull LifecycleOwner lifecycleOwner) {
+ try {
+ Field[] fields = this.getClass().getDeclaredFields();
+ Method method = LiveData.class.getDeclaredMethod("removeObservers", LifecycleOwner.class);
+ for (Field field : fields) {
+ Class type = field.getType();
+ if (type == MutableLiveData.class) {
+ Object value = field.get(this);
+ method.invoke(value, lifecycleOwner);
+ }
+ }
+ } catch (NoSuchMethodException ex) {
+ Timber.e("Unable to clear %s observers, %s.", this.getClass(), ex.getClass().getSimpleName());
+ ex.printStackTrace();
+ } catch (IllegalAccessException ex) {
+ Timber.e("Unable to clear %s observers, %s.", this.getClass(), ex.getClass().getSimpleName());
+ ex.printStackTrace();
+ } catch (InvocationTargetException ex) {
+ Timber.e("Unable to clear %s observers, %s.", this.getClass(), ex.getClass().getSimpleName());
+ ex.printStackTrace();
+ }
+ }
}