2017-09-20 8 views
1

FusedLocationProviderClient.requestLocationUpdates()에 콜백 인 텐트가 완료되기를 기다리고 싶습니다. 시간 초과가있는 while 루프가 최상의 솔루션입니까? 아래 예제는 sans timeout입니다.requestLocationUpdates() 콜백 인 텐트가 끝날 때까지 기다리는 방법은 무엇입니까?

일반적으로 비동기 서비스가 완료 될 때까지 대기하려면 startWakefulService()을 사용하지만 requestLocationUpdates()와 함께 사용하는 방법을 알지 못합니다. 당신이 RxJava/잘 알고 당신이 예를 들어 감시 오브젝트에 메소드 호출을 래핑 (또는 호출 가능, 당신은 최고의 볼 어떤 싱글은)는 UI 아닌 다른 스레드에서 실행하고 조금 RxAndroid 경우

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

답변

1

그런 다음 메서드에서 결과를 얻으면 주 스레드에서 결과를 얻고 원하는대로 수행하십시오.

코드에서이 같이 표시됩니다 :

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
:

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

그렇지 않으면 또 다른 해결책은 예를 들어 AsyncTask를 당신의 방법을 포장하는 것,이 같은 끝낼 것

다음은 내가 한 일입니다.

수동 wakelock을 사용하십시오. 클래스에서 정적 wakelock 변수를 선언하십시오. 또한 acquire()와 release()의 두 가지 메소드를 정의하십시오.

acquire()은 wakelock을 인스턴스화하고 클래스에 정적 wakelock 변수를 지정합니다. 컨텍스트가 필요한 PowerManager를 사용하기 때문에 인스턴스 메서드 (정적이 아님)입니다.

release()은 정적 메서드이므로 다른 클래스에서 호출 할 수 있습니다. 그것은 wakelock을 해제합니다. Wakelock 카운터를 사용하여 싱글 톤 웨이크 록을 사용하고 카운터가 감소하면 카운터를 감소시키고 카운터가 0 일 때 wakelock을 릴리스합니다. 그러나 카운터는 완전히 선택 사항이었습니다.

"트릭"은 인스턴스 wakelock을 만들고 정적 변수에 할당하는 것입니다. 이렇게하면 내 클래스의 인스턴스에 대한 액세스 권한이없는 서비스에서 wakelock을 수정할 수 있습니다.

클래스 외부에서 finish()를 호출하는 대신 더 깨끗한 해결책은 Task.OnCompleteListener()를 사용하여 finish()를 호출하는 것입니다. requestLocationUpdates()는 Task 객체를 반환합니다.

+0

wockelock이 필요했지만 원래 질문에는 분명하지 않았습니다. 그래서 나는 다른 대답을 선택했다. – paperduck