2016-11-09 1 views
1

BLE 스캔이 10 초 동안 활성화 된 다음 10 초 동안 중단되고 뷰가 활성 상태 인 동안 반복되는 기능을 구현하고 싶습니다.BLE 스캔을 위해 Observable에서 지속적으로 가입 및 가입 취소

나는 반응성을 위해 Android BLE API를 래핑하는 RxAndroidBle을 사용하고 있습니다. 나는 Observable<RxBleScanResult>을 사용하는 방법 scanForRange(getConnectAddress());과 간단한 필터 Observable<Integer>을 반환하기 위해 적용된 일부 필터와 맵을 가지고있다. 검사를 시작하려면이 관찰 가능 항목을 간단히 구독하고 구독을 취소 한 다음 검사를 중지해야합니다. 그때 내 onPause()에 그 가입에서 탈퇴 할

@Override 
protected void onResume() { 
    super.onResume(); 

    mRangeScanSubscription = Observable.interval(10000, TimeUnit.MILLISECONDS) 
      .flatMap(new Func1<Long, Observable<Integer>>() { 
       @Override 
       public Observable<Integer> call(Long aLong) { 
        return scanForRange(getConnectAddress()); 
       } 
      }) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnError(new Action1<Throwable>() { 
       @Override 
       public void call(Throwable throwable) { 
        Log.d(TAG, "onResume() error"); 
        throwable.printStackTrace(); 
       } 
      }) 
      .subscribe(new Action1<Integer>() { 
       @Override 
       public void call(Integer integer) { 
        Toast.makeText(DeviceDetailActivity.this, "Range: " + integer, Toast.LENGTH_SHORT).show(); 
       } 
      }); 
} 

: 아래 그림과 같이

내 첫번째 생각은 Observable.interval()를 사용하는 것이 었습니다. 이제는 첫 번째 간격이 방출되면 스캔이 구독되고 10 초마다 시작/중지되는 inteded가 아닌 결과를 계속 방출합니다.

그러면이 기능을 구현하는 가장 좋은 방법은 무엇입니까? Observables와 Handlers를 함께 사용하여 해킹 할 수 있다고 생각하지만 잘못된 것 같습니다.

답변

2

당신은 TakeUntilRepeatWhen 사업자

이 예상대로 작동하는 것 같군
 mRangeScanSubscription = scanForRange(getConnectAddress()) 
      .takeUntil(Observable.timer(10, TimeUnit.SECONDS)) //emits items for 10 seconds 
      .repeatWhen(completed -> completed.delay(10, TimeUnit.SECONDS)) //resubscribes after 10 seconds 
      ... 
+0

를 사용하여이 작업을 수행 할 수 있습니다. 감사! 나는 당신의 답을 옳은 것으로 표시 할 것입니다. – Orbit