android - 实现 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
}
}
}
解决方案
推荐阅读
- android - 滚动后未绘制recyclerview中的自定义视图
- android - 更新如何适用于移动应用程序?
- java - 在java中使用getState
- laravel - 是否可以在 Laravel 5.8 中“锁定”会话?
- python - 网络抓取表可以从错误的数据中正确读取
- python - 结合 .start() 的 Python3 线程不会创建连接属性
- python - 返回没有被放置在右块
- python - 添加节点功能不起作用单链表python
- python-3.x - Python:除非指定文件,否则从 STDIN 读取,它是如何完成的?
- javascript - 从数组中删除成员时,我们如何访问该成员?