LocationRequest setInterval(长毫秒)和LocationRequest setFastestInterval(长毫秒)之间的区别


78

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

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

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

另外:仅当第一次更新的距离与第二次更新的距离大于20米时,是否具有内置功能来检查位置更新?

谢谢!

Answers:


112

根据相关的Android文档

  • setInterval(long) 均值-设置您要获取位置的时间间隔。
  • setFastestInterval(long) 意思是-如果可以尽快找到一个位置,则可以获取它(即另一个应用程序正在使用位置服务)。

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

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

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


4
感谢您指出电池消耗将归功于请求频率更高的应用。
阿米特·库玛

3
如其他注释中所述,如果满足最小距离标准,您还可以设置选项以获取位置更新。使用mLocationRequest.setSmallestDisplacement(10.0)这意味着仅当位移为10 meters
时才

@ kishorer747哇,如果我没有阅读您的评论,我将手动执行该操作!现在觉得傻。
摩西·阿普里科

1
从电池角度来看,@ kishorer747的方式效率不高,如果没有其他应用程序在使用GPS,它将检查位置更改。
Ohad Zadok'17年

只问使用setFastestInterval是否有发生信号阻塞的可能性?因为如果我们站在城市或拥挤的地方,我们会从任何地方收到信号?
Ashana.Jackol

9

另外:仅当第一次更新的距离与第二次更新的距离大于20米时,是否具有内置功能来检查位置更新?

LocationRequest具有可用于设置两次更新之间的最小距离的方法。

int minimumDistanceBetweenUpdates = 20;

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

5
使用此mLocationRequest.setSmallestDisplacement(SMALL_DISPLACEMENT_DISTANCE);
Syed Raza Mehdi 2015年

@Syed Raza Mehdi为什么我要使用它?
卢克横

5

我在android中每隔5分钟编写一次自己的背景位置更新。我想知道其中的差别之间setIntervalsetFastestInterval

假设setFastestInterval();要求的优先级较高Location。对于您设置的任何应用setFastestInterval();,将首先执行该应用(即使其他应用正在使用LocationServices)。

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

当我setInterval5分钟,并setFastestInterval2分钟。在location update被称为每隔2分钟

如果您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;
    }
}

并在第一个请求中将lat和设置long为当前位置(使用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;
}

7
如果你从SDK Location对象的工作,它存在一个函数distanceTo ==> developer.android.com/reference/android/location/...
mrroboaat

1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.