11

最新の Google マップ API から MapView を使用すると、MapView がアクティビティを保持しているため、メモリ リークが発生します。

Leak Canaryを使用しましたが、このトレースがあります


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

D/LeakCanary﹕ * com.google.android.gms.location.internal.sa を参照

D/LeakCanary﹕ * com.google.maps.api.android.lib6.dvc を参照

D/LeakCanary﹕ * com.google.maps.api.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 インスタンスのリーク


誰もこれを見たことがありますか?

4

3 に答える 3

1

この解決策がうまくいかなかったので、別のオプションを提供するだけです。

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) LocationListener に WeakReference を使用する

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);
    }

}

それが役に立てば幸い!

于 2017-04-19T02:47:21.000 に答える