FusedLocationProviderClient утечка памяти? - PullRequest
0 голосов
/ 06 июля 2018

в одном из моих занятий я использую FusedLocationProviderClient для получения постоянного обновления местоположения. Мои коды основаны на этом методе: https://developer.android.com/training/location/receive-location-updates

В моем onCreate я настраиваю провайдера и обратные вызовы

// setup fused location provider
mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);

    // build location request
    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(30000);
    mLocationRequest.setFastestInterval(10000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setSmallestDisplacement(50);

    // Setup the callback function.
    mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // Update UI with location data
                // ...

                mCurrentLocation = location;
            }
        }
    };

В резюме

mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest,
                                mLocationCallback,
                                Looper.myLooper());

Вкл. Пауза

mFusedLocationProviderClient.removeLocationUpdates(mLocationCallback);

И все же по какой-то причине утечка канарейки все еще указывает на утечку памяти. Утечка канарейка, показанная ниже enter image description here

Просматривая информацию о переполнении стека, есть сообщения, которые, похоже, предполагают, что утечка связана с сервисом Google Play. Но эти посты говорили о fusedLocationApi, в то время как я использую fusedLocationProviderClient, поэтому я не уверен, что это то же самое, что я использую здесь. Кто-нибудь может подтвердить для меня? Спасибо!

1 Ответ

0 голосов
/ 17 августа 2018

Я исправил утечки, о которых сообщал LeakCanary, передав SoftReference LocationCallback в FusedLocationProvider.

public class LocationCallbackReference extends LocationCallback {

    private final SoftReference<LocationCallback> mLocationCallbackRef;

    public LocationCallbackReference(LocationCallback locationCallback) {
        mLocationCallbackRef = new SoftReference<>(locationCallback);
    }

    @Override
    public void onLocationResult(LocationResult locationResult) {
        super.onLocationResult(locationResult);
        if (mLocationCallbackRef.get() != null) {
            mLocationCallbackRef.get().onLocationResult(locationResult);
        }
    }

    @Override
    public void onLocationAvailability(LocationAvailability locationAvailability) {
        super.onLocationAvailability(locationAvailability);
        if (mLocationCallbackRef.get() != null) {
            mLocationCallbackRef.get().onLocationAvailability(locationAvailability);
        }
    }
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...