2017-06-06 2 views
0

Je dois convertir l'appel asynchrone FusedLocationApi.getLastLocation à celui de synchronisation. Je ne suis pas un grand expert en Java et je ne suis pas sûr d'avoir bien fait.Android FusedLocationApi.getLastLocation Synchrone

Je souhaite me connecter à GoogleApiClient, puis bloquer le thread appelant jusqu'à ce que des informations d'emplacement ou une erreur soient reçues. Le délai d'expiration de plus de 10 secondes doit être traité comme une erreur.

Est-ce que cela fonctionnera de cette façon ou onConnected sera également appelé sur le thread principal et il sera verrouillé à ce moment-là?

J'ai également remarqué que lock.wait(TimeUnit.SECONDS.toMillis(10)); continue instantanément dans les exécutions normales, mais dans le débogage pas-à-pas, il attend 10 secondes comme prévu. Fondamentalement, je suis en train d'essayer de réécrire le code iOS similaire qui fait son travail en utilisant sémaphore.

var semaphore: DispatchSemaphore! 
var location: CLLocation! 

func lastLocation() -> location? { 
    self.semaphore = DispatchSemaphore(value: 0) 
    self.locationManager.startUpdatingLocation() 
    _ = self.semaphore!.wait(timeout: .now() + 10) // seconds 
    self.semaphore = nil 
    return self.location 
} 

// MARK: - CLLocationManagerDelegate 
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    guard let semaphore = self.semaphore else { 
     return 
    } 
    guard let first = locations.first else { 
     return 
    } 
    self.location = first 
    self.locationManager.stopUpdatingLocation() 
    semaphore.signal() 
} 
+0

Jetez un oeil à cette réponse: https://stackoverflow.com/questions/36740758/how-to-return-value-on-googleapiclient-onconnecté – Entreco

Répondre

1

Vous pouvez utiliser GoogleApiClient.blockingConnect() attendre jusqu'à ce que la connexion est établie, puis appelez FusedLocationApi.getLastLocation().