Android 位置管理器内存泄漏

Android 位置管理器内存泄漏,android,memory-leaks,location,leakcanary,Android,Memory Leaks,Location,Leakcanary,在我的应用程序的启动屏幕中,我开始通过gps或网络收听位置,直到我的第二个活动打开 我的网络位置侦听器: private LocationListener locationListenerNetwork = new LocationListener() { @Override public void onLocationChanged(Location location) { newLocationReceived(location);

在我的应用程序的启动屏幕中,我开始通过gps或网络收听位置,直到我的第二个活动打开

我的网络位置侦听器:

private LocationListener locationListenerNetwork = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            newLocationReceived(location);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    };
private LocationListener locationListenerGPS = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            newLocationReceived(location);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    };
我的gps位置侦听器:

private LocationListener locationListenerNetwork = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            newLocationReceived(location);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    };
private LocationListener locationListenerGPS = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            newLocationReceived(location);
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    };
在onCreate内部,我调用getLocation方法,对于权限,我使用rxPermission:

@SuppressLint("MissingPermission")
    private void getLocation() {
        rxPermissions
                .request(Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribe(granted -> {
                    if (granted) {
                        boolean gpsEnabled, networkEnabled;

                        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                        if (locationManager != null) {
                            gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                            networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                            if (gpsEnabled && locationListenerGPS != null) {
                                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0L, 0f, locationListenerGPS);
                            }

                            if (networkEnabled && locationListenerNetwork != null) {
                                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0L, 0f, locationListenerNetwork);
                            }
                        }


                    } else {
                        Timber.e("LOCATION PERMISSION DENIED");
                    }
                });
    }
收到新位置后,我会呼叫:

private void newLocationReceived(Location location) {
        if (locationManager != null) {
            locationManager.removeUpdates(locationListenerNetwork);
            locationManager.removeUpdates(locationListenerGPS);
        }
        locationManager = null;
        this.location = location;
    }
为了避免内存泄漏,我在onPause、onStop和onDestroy中调用此方法:

private void stopLocationListener() {
        if (locationManager != null) {
            locationManager.removeUpdates(locationListenerNetwork);
            locationManager.removeUpdates(locationListenerGPS);
            locationManager = null;
        }
        if (locationListenerNetwork != null) locationListenerNetwork = null;
        if (locationListenerGPS != null) locationListenerGPS = null;
    }

然而,为了防止泄漏,我仍然在位置管理器中得到内存泄漏。我如何解决这个问题?此外,有时我的启动屏幕通过进度过快,我的运行时权限也可以保留在后台

您是如何解决的?