Android FusedLocationProviderClient是否泄漏内存?

Android FusedLocationProviderClient是否泄漏内存?,android,memory-leaks,location,fusedlocationproviderclient,Android,Memory Leaks,Location,Fusedlocationproviderclient,在我的一个活动中,我正在使用FusedLocationProviderClient来获得持续的位置更新。我的代码基于此方法: 在onCreate中,我设置了提供程序和回调 // setup fused location provider mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this); // build location request mLocationR

在我的一个活动中,我正在使用FusedLocationProviderClient来获得持续的位置更新。我的代码基于此方法:

在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;
            }
        }
    };
在onResume中

mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest,
                                mLocationCallback,
                                Looper.myLooper());
mFusedLocationProviderClient.removeLocationUpdates(mLocationCallback);
在暂停时

mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest,
                                mLocationCallback,
                                Looper.myLooper());
mFusedLocationProviderClient.removeLocationUpdates(mLocationCallback);
然而,出于某种原因,“泄漏金丝雀”仍然表明存在内存泄漏泄漏金丝雀日志如下所示


浏览堆栈溢出,有帖子似乎暗示泄漏是由于谷歌play服务造成的。但是那些帖子讨论的是fusedLocationApi,而我正在使用fusedLocationProviderClient,所以我不确定它是否与我在这里使用的相同。有人能帮我确认一下吗?谢谢大家!

我已通过将LocationCallback的SoftReference传递给FusedLocationProvider修复了LeakCanary报告的泄漏

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);
        }
    }
}
公共类LocationCallbackReference扩展LocationCallback{
专用最终软件参考mLocationCallbackRef;
公共位置回调引用(LocationCallback LocationCallback){
mlLocationCallbackRef=新的软引用(locationCallback);
}
@凌驾
public void onLocationResult(LocationResult LocationResult){
super.onLocationResult(定位结果);
if(mLocationCallbackRef.get()!=null){
mlLocationCallbackRef.get().onLocationResult(locationResult);
}
}
@凌驾
public void onLocationAvailability(位置可用性位置可用性){
超级位置可用性(位置可用性);
if(mLocationCallbackRef.get()!=null){
mlLocationCallbackRef.get().onLocationAvailability(locationAvailability);
}
}
}

我希望这会有所帮助。

对我来说,我使用LocationCallback作为内部匿名对象(因为我必须更新/访问封闭的类数据)&FusedLocationProviderClient导致内存泄漏

然后我将内部类重构为static(非内部)类,并通过传递给static 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
    }
}
导入android.app.Activity
导入androidx.lifecycle.MutableLiveData
导入com.google.android.gms.location*
类LocationUtility构造函数(私有val活动:活动){
私有变量mLocationRequest:LocationRequest?=null
私有变量fusedLocationProviderClient:fusedLocationProviderClient?=null
var currentLocation=MutableLiveData()
私有变量myLocationCallback:myLocationCallback?=null
初始化{
fusedLocationProviderClient=LocationServices.getFusedLocationProviderClient(活动)
myLocationCallback=myLocationCallback(当前位置)
}
//位置回拨
私有类MyLocationCallback(val liveData:MutableLiveData):
LocationCallback(){
覆盖趣味onLocationResult(locationResult:locationResult?){
super.onLocationResult(位置结果)
val纬度=位置结果?位置?获取(0)?纬度
val经度=位置结果?位置?获取(0)?经度
val locationInfo=对(纬度、经度)
liveData.value=locationInfo
}
}

}

为我工作。对于想知道如何使用它的人:只需像上面那样创建类,并且在正常创建myLocationCallback实例之后,在传递给client.requestLocationUpdates(…)时只需传递LocationCallbackReference(myLocationCallback)