diff options
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.java | 36 |
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(); + } + } } |