我有一個集合,其中包含了若干Message對象。
我想通過RxJava從集合中每隔一秒依次發(fā)送集合中的對象
我一開始的時候想這樣操作,發(fā)現(xiàn)一次也不發(fā)送對象
Flowable<Message> messageFlowable = Flowable.fromIterable(mock.messages);
Flowable<Long> timeFlowable = Flowable.interval(1, TimeUnit.SECONDS);
Flowable<String> flowable = Flowable.zip(messageFlowable, timeFlowable, new BiFunction<Message, Long, String>() {
@Override
public String apply(Message message, Long aLong) throws Exception {
return message.content;
}
});
flowable.subscribe(/*....*/)
后來我就想用這種方式
Flowable.fromIterable(mock.messages)
.map(message -> message.content)
.delay(1, TimeUnit.SECONDS)
.subscribe(s -> Timber.d("s = %s", s));
但是發(fā)現(xiàn)集合一瞬間就被發(fā)送完了。并沒有被延時。
有什么辦法可以延時發(fā)送集合嗎?
delay(1s) delay(1s) delay(1s)
0 -----------> 1 -----------> 2 -----------> 3 ...
Flowable.fromIterable(this.mock.messages)
.doOnNext(message -> SystemClock.sleep(2000))
.subscribe(message -> Timber.d("message.content = %s", message.content));
Observable<Message> listObservable = Observable.fromIterable(mock.messages);
Observable<Long> timeObservable = Observable.interval(300, TimeUnit.MILLISECONDS);
Observable<String> zip =
Observable.zip(listObservable, timeObservable, (message, aLong) -> message.content);
zip.doOnComplete(() -> Timber.d("complete"))
.subscribe(s -> Timber.d("s = %s", s));代碼用kotlin寫的,寫android的人不管會不會寫,大概應該能看懂
純kotlin工程,非android工程,線程隨便用的,android里根據(jù)你的線程不同自己考慮用不用主線程
package com.github.caijinglong.rxjava
import io.reactivex.Flowable
import io.reactivex.FlowableSubscriber
import io.reactivex.schedulers.Schedulers
import org.reactivestreams.Subscription
fun main(args: Array<String>) {
var mSubscription: Subscription? = null
val list = arrayListOf(1, 2, 3, 4, 5)
Flowable.fromIterable(list)
.observeOn(Schedulers.io())
.subscribeOn(Schedulers.computation())
.subscribe(object : FlowableSubscriber<Int> {
override fun onComplete() {
}
override fun onSubscribe(s: Subscription) {
mSubscription = s
s.request(1)
}
override fun onNext(p0: Int?) {
println("${Date().toLocaleString()} : $p0" )
Thread.sleep(1000)
mSubscription?.request(1)
}
override fun onError(p0: Throwable?) {
}
})
Thread.sleep(5000)//為了防止退出main函數(shù)結束,實際的android工程中不會退出,這里可以不用寫
}
日志
2018-1-15 15:53:38 : 1
2018-1-15 15:53:39 : 2
2018-1-15 15:53:40 : 3
2018-1-15 15:53:41 : 4
2018-1-15 15:53:42 : 5
Process finished with exit code 0北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。