Android FusedLocationProviderClient是否泄漏内存?
在我的一个活动中,我正在使用FusedLocationProviderClient来获得持续的位置更新。我的代码基于此方法: 在onCreate中,我设置了提供程序和回调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
// 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)