首页 > 解决方案 > 调用 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;
    }
}

标签: javaandroidfusedlocationproviderapi

解决方案


我有一个类似的问题。问题原来是我有多个保存 locationCallback 的类实例,因此被调用以停止位置更新的实例与启动它们的实例不同。

那么对于您的代码,您是否可能有多个 FusedLocationProvider 实例?


推荐阅读