2017-09-20 61 views
1

我想等待FusedLocationProviderClient.requestLocationUpdates()中的回調意圖完成。是一個帶有超時的最佳解決方案的while循環嗎?下面是一個例子,sans超時。如何等待requestLocationUpdates()回調意圖完成?

通常我會使用startWakefulService()等待異步服務完成,但我不知道使用requestLocationUpdates()方法。

Task t = flpc.requestLocationUpdates(locationRequest, pe); 
while (! t.isSuccessful()) { 
    Log.v(TAG, "Waiting for result..."); 
} 

回答

1

如果你熟悉RxJava/RxAndroid一點你可以用你的方法調用中可觀察到的,例如(或贖回,單,不管你看到最好的),在另一個線程比UI運行它,並那麼一旦你從你的方法得到結果,你會在主線程上收到它,然後做任何你想做的事情。

在代碼它看起來就像這樣:

Observable.fromCallable(() -> flpc.requestLocationUpdates(locationRequest, pe)) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(task -> onLocationUpdatesSuccess(task), throwable -> Log.e(TAG, throwable.getMessage())); 

否則另一個解決辦法是換你的方法在的AsyncTask例如,你想最終是這樣的:

new AsyncTask<Void, Void, Task>() { 
      @Override 
      protected Task doInBackground(Void... params) { 
       return flpc.requestLocationUpdates(locationRequest, pe); 
      } 

      @Override 
      protected void onPostExecute(Task task) { 
       onLocationUpdatesSuccess(task) 
      } 
    }.execute(); 
0

這是我最終做的:

使用手動喚醒鎖。在你的類中聲明一個靜態的wakelock變量。還要定義兩個方法:acquire()和release()。

acquire()實例化一個喚醒鎖併爲其指派一個靜態的wakelock變量。它是一個實例方法(不是靜態的),因爲它使用需要上下文的PowerManager。

release()是一種靜態方法,所以其他類可以調用它。它釋放了喚醒鎖。我用一個帶有喚醒鎖計數器的單身喚醒鎖,當這個被調用時遞減計數器,並且當計數器爲零時釋放喚醒鎖。但櫃檯完全是可選的。

所有這些的「訣竅」是創建一個實例喚醒鎖並將其分配給一個靜態變量。這允許在沒有訪問我的課程實例的服務中修改wakelock。

而不是從類外部調用finish(),更簡潔的解決方案是使用Task.OnCompleteListener()調用finish()。 requestLocationUpdates()返回一個Task對象。

+0

我需要一個喚醒鎖,但這在我的原始問題中並不清楚。所以我選擇了另一個答案。 – paperduck