【问题标题】:Difference between LocationRequest setInterval (long millis) and LocationRequest setFastestInterval (long millis)LocationRequest setInterval (long millis) 和 LocationRequest setFastestInterval (long millis) 的区别
【发布时间】:2014-11-24 16:46:07
【问题描述】:

我在 android 中每隔 5 分钟编写一次我自己的后台位置更新。我想知道 setInterval 和 setFastestInterval 的区别

当我将Interval 设置为 5 分钟并将FastestInterval 设置为 2 分钟时。每 2 分钟调用一次位置更新。

我想知道区别。我不明白这个https://developer.android.com/reference/com/google/android/gms/location/LocationRequest.html的开发者页面到底写了什么

另外:只有当第一次更新的距离超过 20 米,第二次更新时,是否有内置功能来检查位置更新?

谢谢!

【问题讨论】:

    标签: android gps location locationmanager


    【解决方案1】:

    基于相关Android documentation

    • setInterval(long) 表示 - 设置您想要获取位置的时间间隔。
    • setFastestInterval(long) 表示 - 如果一个位置可用,您可以更快地获得它(即另一个应用程序正在使用位置服务)。

    例如,您启动应用程序并通过setInterval(60*1000) 注册它,这意味着您将每 60 秒获得一次更新。

    现在您拨打setFastestInterval(10*1000)。如果您是唯一使用定位服务的应用程序,您将继续大约每 60 秒接收一次更新。如果另一个应用正在使用更新率更高的位置服务,您将获得更多位置更新(但不会比每 10 秒更频繁)。

    我相信它对您的应用消耗的电池寿命有很好的影响,您可以定义可以等待的最长时间,同时说如果有可用更新,您就需要它。电池消耗将计入请求更频繁更新的应用,而不是您的。

    【讨论】:

    • 感谢您指出电池消耗将计入请求更频繁的应用程序。
    • 正如在其他 cmets 中指出的那样,您还可以设置选项以在满足最小距离标准时获取位置更新。使用mLocationRequest.setSmallestDisplacement(10.0),这意味着只有当位移为10 meters时才获取位置更新
    • @kishorer747 哇,如果我没有阅读您的评论,我将手动实现它!现在觉得很傻。
    • 电池方面,@kishorer747 的方式效率不高,如果没有其他应用在使用 GPS,它将检查位置变化。
    • 只是询问使用 setFastestInterval 是否有可能发生信号阻塞?因为如果我们站在城市或拥挤的地区,我们就会从各个地方收到信号?
    【解决方案2】:

    另外:是否有内置功能仅在第一次更新的距离超过 20 米时才检查位置更新?

    LocationRequest 有一个方法可以用来设置更新之间的最小距离。

    int minimumDistanceBetweenUpdates = 20;
    
    LocationRequest request = new LocationRequest();
    request.setMinimumDisplacement(minimumDistanceBetweenUpdates);
    // ... request.setInterval(interval); etc
    

    【讨论】:

    • 使用这个 mLocationRequest.setSmallestDisplacement(SMALL_DISPLACEMENT_DISTANCE);
    • @Syed Raza Mehdi 为什么我要使用它?
    【解决方案3】:

    我在 android 中每隔 5 分钟 编写自己的后台位置更新。我想知道setIntervalsetFastestInterval之间的区别

    假设setFastestInterval(); 具有更高的请求Location 的优先级。对于您设置setFastestInterval(); 的任何应用程序,它将首先执行该应用程序(即使其他应用程序正在使用LocationServices)。

    例如:如果 APP1 具有 setFastestInterval(1000 * 10) 并且 APP2 具有 setInterval(1000 * 10),则 两个 APPS 具有相同的请求间隔。但发出第一个请求的是 APP1。 (这是我的理解,答案可能不正确)

    当我 setInterval5 分钟setFastestInterval2 分钟location update2 分钟 调用一次。

    如果您将setFastestInterval()setInterval() 一起使用,则应用程序将尝试在setFastestInterval() 中指定的时间发出请求,这就是为什么您的应用程序每2 分钟发出一个请求 .

    另外:只有当第一次更新的距离超过 20 米,第二次更新时,是否有内置功能来检查位置更新?

    对于每 20 米发出请求,您可以创建一个LocationModel

        public class LocationModel {
        private double latitude;
    
        private double longitude;
        public LocationModel(){
        }
    
        public double getLatitude() {
            return latitude;
        }
    
        public void setLatitude(double latitude) {
            this.latitude = latitude;
        }
    
        public double getLongitude() {
            return longitude;
        }
    
        public void setLongitude(double longitude) {
            this.longitude = longitude;
        }
    }
    

    在第一个请求中,您将latlong 设置为当前位置(使用getLastLocation();

    然后onLocationChanged()你从对象中获取数据并与new Current Location比较

    float distanceInMeters = distFrom((float)locationObj.getLatitude(), (float)locationObj.getLongitude(), (float)mCurrentLocation.getLatitude(), (float)mCurrentLocation.getLongitude());
    

    使用此功能也是SO用户的建议

    public static float distFrom(float lat1, float lng1, float lat2, float lng2) {
        double earthRadius = 6371; //kilometers
        double dLat = Math.toRadians(lat2-lat1);
        double dLng = Math.toRadians(lng2-lng1);
        double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
                Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
                        Math.sin(dLng/2) * Math.sin(dLng/2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        float dist = (float) (earthRadius * c);
    
        return dist;
    }
    

    【讨论】:

    【解决方案4】:

    setInterval(长毫秒) 这个间隔是不准确的。您可能根本不会收到更新(如果没有可用的位置资源),或者您收到更新的速度可能比请求的慢。您也可能比请求更快地收到它们(如果其他应用程序以更快的间隔请求位置)。可以使用 setFastestInterval(long) 控制您将接收更新的最快速度。默认情况下,此最快速率是间隔频率的 6 倍。

    setFastestInterval(长毫秒) 与 setInterval(long) 不同,此参数是精确的。您的应用程序接收更新的速度永远不会超过此值。 如果您不调用此方法,则会为您选择一个最快的间隔。这将是一个比您的活动间隔 (setInterval(long)) 更快的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 2020-09-03
      相关资源
      最近更新 更多