2014-01-23 3 views
5

저는 서비스와 활동으로 구성된 앱을 만들고 있습니다. 이 서비스는 LocationClient 객체를 사용하여 매시간 을 요청합니다.. 액티비티는 다른 LocationClient 객체를 사용하여 버튼을 클릭 한 후 단일 현재 위치 을 요청합니다. 서비스에서여러 위치 클라이언트가 간섭하고 있습니까?

:

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가 제공 한 가능한 가장 작은 간격을 사용하려고 시도합니다. 내 경우에는 이것이 서비스 중 하나가 아니라 서비스 중 하나입니다. 다른 예 : "My tracks"이 백그라운드에서 매 순간 위치를 추적하는 경우 내 활동은 "My tracks"의 내부를 모른 채로 훨씬 빠르게 (~ 3 초) 현재 위치를 훨씬 빠르게 얻을 수 있습니다. 그러나 내 활동 위의 두 LocationClients를 사용하면 항상 서비스가 설정 한 시간을 기다리고 있습니다. – Biggie

+0

설명서에 "이 방법은 앱이 위치 업데이트를받는 데 걸리는 시간을 밀리 초 단위로 설정합니다. 다른 위치 정보 서비스에서 업데이트를 수신하는 앱이없는 경우이 속도로 업데이트가 전송됩니다." 문서는 "app"에 대한 것이지 "LocationClient/LocationListener-object"에 관한 것은 아닙니다. 그래서 동일한 앱에 여러 LocationClient가있는 문제에 대해 질문했습니다. 나를 위해 그것이 응용 프로그램의 LocationClients에서 가장 먼저 사용 된 간격과 같습니다. 내 경우에는 60 초 간격으로 – Biggie

+0

문서에 LocationClient를 앱당 하나의 인스턴스로 제한하는 것은 없습니다. 그러나 업데이트가 앱 전반에 걸쳐 있다는 점은 탐구 할만한 가치가 있습니다. 이것이 Google Play 서비스의 요점입니다. 전화 당 인스턴스/버전은 하나뿐입니다. 플레이 서비스에서 LocationClient를 통해 업데이트를 요청해야한다면, 마지막 요청이 뒤 따르게 될 것이라고 생각합니다. 값을 전환하고 반대 결과를 얻는 지 확인해야합니다. – Rarw