2014-01-23 54 views
5

我正在研究一个由服务和活动组成的应用程序。该服务使用LocationClient对象来请求当前位置每分钟。该活动使用另一个LocationClient对象在单击按钮后请求单个当前位置多个LocationClients干扰?

在服务:

mLocationRequest = LocationRequest.create(); 
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
mLocationRequest.setInterval(60000); 
mLocationRequest.setFastestInterval(60000); 
mLocationClient = new LocationClient(this, this, this); 
// ... when connected: 
mLocationClient.requestLocationUpdates(mLocationRequest, this); 

在活动:

mLocationRequest = LocationRequest.create(); 
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
mLocationRequest.setInterval(0); // 0 should be ok since only a single location is requested 
mLocationRequest.setFastestInterval(0); 
mLocationRequest.setNumUpdates(1); // get only a single location 
mLocationClient = new LocationClient(this, this, this); 
// ... when connected: 
mLocationClient.requestLocationUpdates(mLocationRequest, this); 

服务单独就像预期。

但是,如果服务已启动并且该活动试图获取单个当前位置,则它会收到该位置,直到服务收到更新的位置。所以这个活动需要等待60秒。

但是,如果服务是未启动并且该活动尝试获取单个当前位置,则它会在预计的短时间(通常为< 5秒)后收到该位置。

是什么导致了这个问题?每个应用只允许一个LocationListener?

回答

1

首先 - 如果您需要立即位置,请不要请求位置更新,只需在位置客户端上调用getLastLocation()即可。如果LocationClient有一个可用,那么这会给你最好的/最近的位置结果。如果没有,那么我会请求更新。

第二 - 我不认为您可以在单个应用中拥有多少位置客户端,但我认为您错过了这些客户端与Google Play服务进行交互以接收更新的限制。查看docs提供了一些见解。

如果向下滚动到关于指定更新参数的部分,您会看到LocationClient类型位于您和所寻找的位置数据之间。手机上实施LocationClient的所有其他应用程序都试图访问相同的数据。 LocationClient尝试在您要求的时间间隔内填写您的请求。但是,因为其他使用LocationClient的应用程序可能正在尝试访问相同的数据,所以时间不受保证。最好的例子是setFastestInterval():

调用LocationRequest.setFastestInterval()也有助于节省电量。 当您请求通过调用 LocationRequest.setInterval()一个最好的更新速率,并通过调用 LocationRequest.setFastestInterval(最大速率),那么你的应用程序得到了相同的 更新速率为在系统中最快的速度。如果其他应用有 请求更快的速度,您可以享受更快的速度。如果没有 其他应用的未处理速率请求未完成,则您的应用将以您使用LocationRequest.setInterval()指定的速率收到 更新。

当您收到更新时并未直接链接到您请求的时间。有时会更快,有时候会更晚。间隔只是一个偏好。

+0

我知道时间不能保证。;-)但是,如果我正确理解文档,那么位置服务会尝试使用注册的LocationRequests给定的最小可能时间间隔。在我的情况下,这是活动之一,而不是服务之一。另一个例子:如果“我的曲目”在后台每分钟跟踪一次位置,那么我的活动仍然可以更快地获取当前位置(〜3秒) - 而无需知道“我的曲目”的内部情况。但是,使用我的Activity上方的两个LocationClient始终等待服务设置的时间。 – Biggie

+0

请注意,文档中提到:“此方法设置您的应用更喜欢接收位置更新的速率(以毫秒为单位),如果没有其他应用正在从定位服务接收更新,您的应用将以此速率接收更新。”文档讨论的是“应用程序”,而不是“LocationClient/LocationListener对象”。这就是为什么我问在同一个应用程序中有多个LocationClient的问题。对我来说,似乎任何应用程序的LocationClients中第一次使用的时间间隔都会胜出。在我的情况下,60秒的服务时间间隔。 – Biggie

+0

那么在文档中没有任何内容将LocationClient限制为每个应用的一个实例。但更新在应用程序范围内的观点值得探讨。对于Google Play服务来说,这是我的观点。每部手机只有一个实例/版本。如果您必须通过LocationClient从播放服务请求更新,我会想象最后一个请求会是随后的请求。你应该切换这些值,看看你是否得到相反的结果。 – Rarw