java - 调用 removeLocationUpdates 后位置回调未停止
问题描述
我正在通过此类接收位置更新,一切正常,除了有时位置回调在调用 StopLocationUpdate() 后不会停止。请帮我纠正错误。我已经检查了可用于停止位置更新的答案,并且我已经实现了相同的答案。
FusedLocationProvider 类:
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
class FusedLocationProvider {
/*Fused API Client Objects.*/
private FusedLocationProviderClient mFusedLocationClient;
private LocationCallback mLocationCallback;
private LocationRequest mLocationRequest;
/*Listener Interface.*/
private FusedLocationListener iFusedLocationListener;
/*Source activity.*/
private Context context;
private boolean isRequestingUpdates = false;
FusedLocationProvider(Context context, LocationRequest locationRequest) {
this.context = context;
mLocationRequest = locationRequest;
/*Get FusedLocationProviderClient.*/
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this.context);
/*Start process of building the LocationCallback, LocationRequest.*/
createLocationRequestCallback();
}
void StartLocationUpdate(FusedLocationListener iListener) {
/*Hook the listener for callbacks.*/
iFusedLocationListener = iListener;
/*Check if request already ongoing.*/
if (!isRequestingUpdates) {
initiateLocationUpdate();
}
}
void StopLocationUpdate() {
if (isRequestingUpdates) {
mFusedLocationClient.removeLocationUpdates(mLocationCallback);
iFusedLocationListener.OnLocationUpdateStopped();
isRequestingUpdates = false;
}
}
private void createLocationRequestCallback() {
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
iFusedLocationListener.OnLocationUpdate(locationResult);
}
};
}
private void initiateLocationUpdate() {
if (ActivityCompat.checkSelfPermission(context,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
iFusedLocationListener.OnLocationUpdateStarted();
mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, null /* Looper */);
isRequestingUpdates = true;
}
}
解决方案
我有一个类似的问题。问题原来是我有多个保存 locationCallback 的类实例,因此被调用以停止位置更新的实例与启动它们的实例不同。
那么对于您的代码,您是否可能有多个 FusedLocationProvider 实例?
推荐阅读
- javascript - 在 Selenium C# 中平滑拖放元素
- javascript - Vue Nuxtjs 传递道具
- c# - 使用 EditorGUILayout.PropertyField 时可以删除这个大空间吗?
- excel - 从周一到周日计算当前一周的小时数
- azure-data-explorer - Kusto / KQL 查询获取不同的输出,然后在后续查询中使用
- reactjs - Reactjs redux 商店没有更新
- spring-boot - @ConstructorBinding 配置在实现 Validator 接口时不会触发验证
- c# - 使用任何 dotnet 托管模型在启动时运行代码
- python - 检索一行中的第一个值并放入一个连续的列
- python - 针对特定条件在 pandas 数据框中创建滞后特征