2017-12-15 3 views
0

Observable.create(...)을 사용하여 일부 비동기 코드를 래핑합니다. 비동기 코드는 5 초 동안 "활성"상태 여야하며 중지해야합니다.RxJava 2 : Observable.create() 비동기 코드가 Thread.sleep()을 사용하여 종료 될 때까지 대기

Observable.<MyObject>create(emitter -> { 

    // Some async code 

    emitter.setDisposable(Disposables.fromRunnable(() -> { 
     // Stop the above async code 
    })); 

    // Wait for 5 seconds until the async code above has had enough time to finish its task. 
    Thread.sleep(5000); 

    if (!emitter.isDisposed()) { 
     // Stop the above async code 
     emitter.setDisposable(null); 
    } 
})... 

내가 Thread.sleep(5000)가 사용되기 때문에이 최선의 방법입니다 있는지 확실하지 않습니다 : 이것은 내가 현재를 중지하고 방법이다. 일부 RxJava 코드로 이것을 수행하는 더 좋은 방법이 있습니까?

Observable.<MyObject>create(emitter -> { 

    // Some async code 

    emitter.setDisposable(Disposables.fromRunnable(() -> { 
     // Stop the above async code 
    })); 
}) 
.take(5, TimeUnit.SECONDS); 

당신은 여전히 ​​create에 설치 Disposable에 있습니다

+1

이 비동기 코드 란 무엇입니까? 자체적으로 완료했는지 여부를 알 수 없습니까? 소스를 멈출 수있는 타임 아웃'take()'오버로드가 있지만 여전히'create'에'setDisposable'을 가져야합니다. – akarnokd

+0

@akarnokd 비동기 코드는 Android의 Network Service Discovery (https://developer.android.com/training/connect-devices-wirelessly/nsd.html#discover)입니다. 청취자가 등록 해제 될 때까지 로컬 네트워크의 장치를 검색합니다. 난 단지 한 번 스캔하기를 원하기 때문에 수동으로 5 초 후에 청취자를 등록 해제 한 다음에 emitter.onComplete()를 호출해야합니다. 'take()'가 관찰 가능 객체를 완성하고 처리합니까? –

+0

Javadoc과 다이어그램을 살펴보십시오. [take()] (http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Observable.html#take-long-java.util.concurrent. TimeUnit-). – akarnokd

답변

1

는 지정된 시간이 경과 할 때까지 소스에서 항목을 가질 수 있습니다 take의 시간 제한 과부하가 존재한다.

관련 문제