Android 位置管理器内存泄漏
在我的应用程序的启动屏幕中,我开始通过gps或网络收听位置,直到我的第二个活动打开 我的网络位置侦听器: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);
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;
}
然而,为了防止泄漏,我仍然在位置管理器中得到内存泄漏。我如何解决这个问题?此外,有时我的启动屏幕通过进度过快,我的运行时权限也可以保留在后台您是如何解决的?