首页 > 解决方案 > 实现 FusedLocationProvider 时发生内存泄漏

问题描述

在 GPS 定位实施过程中,我遇到了内存泄漏问题。我已经使用 FusedLocationProvider 的基本实现过程来获取最后一个位置。但是根据回溯,它显示出由于这种实现导致的内存泄漏。在实现 FusedLocationProvider API 时,是否有人面临相同类型的内存泄漏问题?我应该遵循什么来避免这里的内存泄漏?我正在分享我的转储状态日志、内存跟踪日志和代码片段,以便更好地理解问题。 这是日志链接: https ://drive.google.com/drive/folders/1bzeACMj6erp2up9pgmueawixi8JVhICw?usp=sharing

任何形式的建议都会有所帮助。

在以下设备上测试了该问题:

内存:2GB 软件版本:T295XXU4BUD3

三星

这是代码片段:

构建.gradle

implementation 'com.google.android.gms:play-services-location:17.0.0'

安卓清单

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

初始化

 private FusedLocationProviderClient mFusedLocationClient;
 private LocationRequest locationRequest;
 private LocationCallback locationCallback;
 private boolean isGPS = false;
 private boolean skipGPS;
 private static final long UPDATE_INTERVAL = 5000, FASTEST_INTERVAL = 3000;

创建

skipGPS = false;
        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(getApplicationContext());

        new GpsUtils(HouseholdActivity.this).turnGPSOn(new GpsUtils.onGpsListener() {
            @Override
            public void gpsStatus(boolean isGPSEnable) {
                // turn on GPS
                isGPS = isGPSEnable;
            }
        });
        //prepareGpsAccess(); //causing memory leak..
}

方法实现:

public void getLocation() {
        if (ActivityCompat.checkSelfPermission(HouseholdActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                || ActivityCompat.checkSelfPermission(HouseholdActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(HouseholdActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                    AppConstants.LOCATION_REQUEST);

        } else {
            if (mFusedLocationClient != null) {
                mFusedLocationClient.getLastLocation().addOnSuccessListener(HouseholdActivity.this, location -> {
                    if (location != null) {
                        
                        Log.e(TAG, "Location: " + location.getLatitude());
            Log.e(TAG, "Location: " + location.getLongitude());

                    } else {
                        Log.e(TAG, "Location: callback triggered...");
                    }
                });
            }

        }
    }


  @SuppressLint("MissingPermission")
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Log.e(TAG, "Permission missing... result");
        switch (requestCode) {
            case 1000: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    mFusedLocationClient.getLastLocation().addOnSuccessListener(HouseholdActivity.this, location -> {
                        if (location != null) {
                                household.setLat(location.getLatitude());
                                household.setLon(location.getLongitude());
                            
                        } else {
                            //mFusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);
                        }
                    });

                } else {
                    Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == AppConstants.GPS_REQUEST) {
                isGPS = true; // flag maintain before get location
            }
        }
    }

标签: androidmemory-leaksgpsfusedlocationproviderapi

解决方案


推荐阅读