在我的一个活动中,我使用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;
}
}
};In onResume
mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest,
mLocationCallback,
Looper.myLooper());In onPause
mFusedLocationProviderClient.removeLocationUpdates(mLocationCallback);然而,由于某种原因,泄漏金丝雀仍然表明存在内存泄漏。泄漏金丝雀日志如所示

浏览堆叠溢出,有帖子似乎暗示泄漏是由于谷歌播放服务。但是那些帖子是关于fusedLocationApi的,而我在使用fusedLocationProviderClient,所以我不确定这是否和我在这里使用的一样。有人能帮我确认一下吗?谢谢!
发布于 2018-08-16 21:01:02
通过将LeakCanary的SoftReference of LocationCallback传递给FusedLocationProvider,我修复了LocationCallback报告的漏洞。
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);
}
}
}我希望这能帮上忙。
发布于 2020-07-26 20:54:16
对我来说,我使用LocationCallback作为一个内部匿名对象(因为我必须更新/访问封闭的类数据)&LocationCallback导致了内存泄漏。
然后,我将内部类重构为static(non-inner)类&通过传递给静态LocationCallback对象的活动数据更新包围类数据。
import android.app.Activity
import androidx.lifecycle.MutableLiveData
import com.google.android.gms.location.*
class LocationUtility constructor(private val activity: Activity) {
private var mLocationRequest: LocationRequest? = null
private var fusedLocationProviderClient: FusedLocationProviderClient? = null
var currentLocation = MutableLiveData<Pair<Double?, Double?>>()
private var myLocationCallback: MyLocationCallback? = null
init {
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(activity)
myLocationCallback = MyLocationCallback(currentLocation)
}
// Location call back
private class MyLocationCallback(val liveData: MutableLiveData<Pair<Double?, Double?>>) :
LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
super.onLocationResult(locationResult)
val latitude = locationResult?.locations?.get(0)?.latitude
val longitude = locationResult?.locations?.get(0)?.longitude
val locationInfo = Pair(latitude, longitude)
liveData.value = locationInfo
}
}}
https://stackoverflow.com/questions/51204390
复制相似问题