2017-10-17 89 views
1

我剛剛開始使用RxJava/android並開始練習並開始使用我希望使每個1秒都能發出字符串的字符,我該怎麼做?以下是我迄今爲止嘗試過,它只是發出串一次:如何使Observable在1秒的時間間隔後發出字符

Observable<String> myObservable = Observable.interval(5000L, TimeUnit.MILLISECONDS) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .just("Hello"); 

我希望你好像1秒後這第一EMIT^h發出E等

回答

0

可以zip有間隔字符產生源,如StringFlowable.characters()擴展操作符:

StringFlowable.characters("Hello world") 
.zipWith(Flowable.interval(1000L, TimeUnit.MILLISECONDS), (a, b) -> a) 
.observeOn(AndroidSchedulers.mainThread()) 
.blockingSubscribe(System.out::print, Throwable::printStackTrace, System.out::println); 

.observeOn(AndroidSchedulers.mainThread()).just("Hello");

請注意,just是一種靜態方法,它返回一個新的獨立Observable,因此在實例方法上調用.just()將與該先前的流無關。

+0

無法解決StringFlowable – blackHawk

+0

同樣不明白這「只是是返回一個靜態方法一個新的獨立觀察的」,因爲如果我有這樣的觀察到的,並保存到類型可觀測的變量並使用它任何地方它應該是可觀察的,如果它不是那麼我將如何調用訂閱它 – blackHawk

+0

我提出了Observable myObservable = Observable.range(1,6).interval(5000,TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread ());像這樣它在1秒後發射值,但範圍不起作用,它不會停止在6它超出6 – blackHawk

1

使用flatMap()將字符串「hello」拆分爲字母「h」,「e」,...「o」。

new ArrayList<>(Arrays.asList(string.split(""))))構造List<String> lettersObservable.fromIterable(letters)將每個字母發送到下游。

然後zipWith()拉扯兩個可觀察物,一個是字母,另一個是第二個時間。

public static void main(String[] args) throws InterruptedException { 

    Observable.just("Hello") 
      .flatMap(string -> Observable.fromIterable(new ArrayList<>(Arrays.asList(string.split(""))))) 
      .zipWith(Observable.interval(0, 1, TimeUnit.SECONDS), (letter, time) -> letter) 
      .subscribe(System.out::println); 

    Thread.sleep(5000); 
} 

打印:

H 
e 
l 
l 
o 

Process finished with exit code 0 
相關問題