首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FusedLocationProviderClient会泄漏内存吗?

FusedLocationProviderClient会泄漏内存吗?
EN

Stack Overflow用户
提问于 2018-07-06 06:41:20
回答 3查看 1.4K关注 0票数 4

在我的一个活动中,我使用FusedLocationProviderClient来获得不断的位置更新。我的代码是基于这种方法的:https://developer.android.com/training/location/receive-location-updates

在我的onCreate中,我设置了提供程序和回调

代码语言:javascript
复制
// 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

代码语言:javascript
复制
mFusedLocationProviderClient.requestLocationUpdates(mLocationRequest,
                                mLocationCallback,
                                Looper.myLooper());

In onPause

代码语言:javascript
复制
mFusedLocationProviderClient.removeLocationUpdates(mLocationCallback);

然而,由于某种原因,泄漏金丝雀仍然表明存在内存泄漏。泄漏金丝雀日志如所示

浏览堆叠溢出,有帖子似乎暗示泄漏是由于谷歌播放服务。但是那些帖子是关于fusedLocationApi的,而我在使用fusedLocationProviderClient,所以我不确定这是否和我在这里使用的一样。有人能帮我确认一下吗?谢谢!

EN

回答 3

Stack Overflow用户

发布于 2018-08-16 21:01:02

通过将LeakCanary的SoftReference of LocationCallback传递给FusedLocationProvider,我修复了LocationCallback报告的漏洞。

代码语言:javascript
复制
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);
        }
    }
}

我希望这能帮上忙。

票数 4
EN

Stack Overflow用户

发布于 2020-07-26 20:54:16

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

然后,我将内部类重构为static(non-inner)类&通过传递给静态LocationCallback对象的活动数据更新包围类数据。

代码语言:javascript
复制
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
    }
}

}

票数 2
EN

Stack Overflow用户

发布于 2022-07-08 12:09:33

谷歌最近在其最新的play-:20.0.0发行版中解决了这个内存泄漏问题。释放说明

要了解有关此内存泄漏历史的更多信息,请查看

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51204390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档