java - 调用 removeLocationUpdates 后位置回调不会停止

标签 java android fusedlocationproviderapi

我正在通过此类接收位置更新,一切正常,除了有时位置回调在调用 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 实例吗?

关于java - 调用 removeLocationUpdates 后位置回调不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53910991/

相关文章:

java - 递归查找 "indirect relationships"

android:编程调用软键盘的问题

安卓 MVP : which layer should store context variable

android - 如何使用 Fused Location Provider API 跟踪用户是否有意关闭位置

android - 给出 java.lang.NullPointerException : when i click on current location button

java - 从 XmlStreamReader 解码 JAXB 会导致 null 对象

java - 使用 fused Location Provider 获取当前位置

java - 通过 int 字段的降序对列表进行排序,如果 int 字段相等则按字典顺序排序

android - Array Shared Preferences 重构 TableLayout OnDestroy

android - FusedLocation API - 未调用 onLocationChanged