10

При использовании MapView из новейшего API карт Google, я получаю утечку памяти, потому что MapView удерживает мою активность.MapView v2 Сохранение контекста вокруг

Я Leak Canary и есть этот след


D/LeakCanary: * GC ROOT com.google.android.gms.location.internal.ta

D/LeakCanary: * ссылки ком .google.android.gms.location.internal.sa

D/LeakCanary: * ссылки com.google.maps.api.android.lib6.dvc

D/LeakCanary: * ссылок com.google.maps .а pi.android.lib6.d.aj.b

D/LeakCanary: * ссылки com.google.maps.api.android.lib6.gmm6.cpa

D/LeakCanary: * ссылки com.google. maps.api.android.lib6.gmm6.cymParent

D/LeakCanary: * ссылки android.widget.FrameLayout.mParent

D/LeakCanary: * референции com.google.android.gms.maps.MapView .mContext

D/LeakCanary: * утечка com.myapp.activities.main.AttractionDetailActivity в позиция


Кто-нибудь видел это раньше?

+1

Известная проблема. Если у него будет достаточно людей, возможно, он будет исправлен до 2018 года: https://code.google.com/p/gmaps-api-issues/issues/detail?id=8111 –

ответ

20

Проверьте, если вы вызываете googleMap.setMyLocationEnabled(true) в свой обратный вызов onMapReady().

Если вы находитесь, тогда вы должны позвонить googleMap.setMyLocationEnabled(false) в свой onDestroy.

+0

На самом деле это сработало ... Тем не менее я думаю это ошибка, которая должна быть исправлена, но спасибо! – Marcel

+2

Я все еще вижу утечку даже при применении этого обходного пути. – NasaGeek

+0

@NasaGeek Угадайте, что это слишком поздно, но может подтвердить, что утечка такая же, как эта или что-то еще. В SDK Google Maps много утечек, я думаю, большинство из них были исправлены в последней версии сервисов Google Play – Chaits

7

Это работает для меня:

@Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mMapView.onDestroy(); 
     if (mMap != null) { 
      mMap.setMyLocationEnabled(false); 
      mMap.clear(); 
     } 
    } 
0

Просто, чтобы дать еще один вариант, как это решение не работает для меня.

Я нашел это действительно полезный нить, где предложить некоторые обходные пути, связанные с утечкой памяти в MapView:

https://github.com/googlesamples/android-play-location/issues/26

Для меня самое интересное из этой темы (который работал для меня) является:

1) Убедитесь в том, чтобы отменить обратные вызовы:

if (googleApiClient != null) { 
     googleApiClient.unregisterConnectionCallbacks(this); 
     googleApiClient.unregisterConnectionFailedListener(this); 

     if (googleApiClient.isConnected()) { 
       LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this); 
     } 

     googleApiClient.disconnect(); 
     googleApiClient = null; 
} 

2) Используйте WeakReference для LocationListener

public class WeakLocationListener implements LocationListener { 

    private final WeakReference<LocationListener> locationListenerRef; 

    public WeakLocationListener(@NonNull LocationListener locationListener) { 
     locationListenerRef = new WeakReference<>(locationListener); 
    } 

    @Override 
    public void onLocationChanged(android.location.Location location) { 
     if (locationListenerRef.get() == null) { 
      return; 
     } 
     locationListenerRef.get().onLocationChanged(location); 
    } 

} 

Надеется, что это помогает!

Смежные вопросы