专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
开发者全社区  ·  男朋友和女领导的聊天记录 ·  17 小时前  
开发者全社区  ·  十年又是一个轮回:从互联网+到AI+ ·  2 天前  
开发者全社区  ·  裸辞1天 vs 裸辞10天 vs 裸辞30天 ·  2 天前  
开发者全社区  ·  央企程序员到底香不香 ·  2 天前  
开发者全社区  ·  大佬与梁文锋第一次的接触 ·  3 天前  
51好读  ›  专栏  ›  安卓开发精选

RxJava操作符系列一(下)

安卓开发精选  · 公众号  · android  · 2016-12-19 20:39

正文

(点击 上方公众号 ,可快速关注)


来源:伯乐在线专栏作者 - Code4Android

链接:http://android.jobbole.com/85251/

点击 → 了解如何加入专栏作者


接上文


Range


该操作符创建特定整数序列的Observable,它接受两个参数,一个是范围的起始值,一个是范围的数据的数目。如果你将第二个参数设为0,将导致Observable不发射任何数据(如果设置为负数,会抛异常)。


Observable . range ( 1 , 4 )

. subscribe ( new SubscriberInteger > () {

public String TAG = "RXJAVA" ;

@ Override

public void onCompleted () {

Log . e ( TAG , "onCompleted: " );

}

@ Override

public void onError ( Throwable e ) {

Log . e ( TAG , "onError: " );

}

@ Override

public void onNext ( Integer integer ) {

Log . e ( TAG , "onNext: " + integer );

}

});


输出信息


onNext : 1

onNext : 2

onNext : 3

onNext : 4

onCompleted :


你可以在代码实战中,更改第二个参数为负数,或者0,以及将第一个参数更改为你想测试的任意值,去观察执行日志帮助理解。


Timer


Timer操作符创建一个在给定的时间段之后返回一个特殊值的Observable。它在延迟一段给定的时间后发射一个简单的数字0 。


Observable . timer ( 1 , TimeUnit . SECONDS )

. subscribe ( new Subscriber () {

public String TAG = "RXJAVA" ;

@ Override

public void onCompleted () {

Log . e ( TAG , "onCompleted: " );

}

@ Override

public void onError ( Throwable e ) {

Log . e ( TAG , "onError: " );

}

@ Override

public void onNext ( Long integer ) {

Log . e ( TAG , "onNext:1111111 " + integer );

}

});


对于该操作符默认在computation调度器上执行的,如果你想在onNext()回调方法更新UI,需要通过observeOn(AndroidSchedulers.mainThread())设置,否则会调用onError()方法。当然Time人提供的有一个三个参数的方法timer(long,TimeUnit,Scheduler)可以指定 Scheduler 。


Interval


该操作符按固定的时间间隔发射一个无限递增的整数序列,它接受一个表示时间间隔的参数和一个表示时间单位的参数,当然该操作符合Timer一样,是在computation调度器上执行的,若想更新UI需要指定Scheduler 为AndroidSchedulers.mainThread()。


Subscription subscription = Observable . interval ( 1 , TimeUnit . SECONDS )

. observeOn ( AndroidSchedulers . mainThread ())

. subscribe ( new Action1 () {

@ Override

public void call ( Long aLong ) {

tv . append ( " " + aLong + "   " );

}

});


通过上面代码就会每隔1秒在tv上追加一个数字,并且会永远执行。如果在某个时刻不想继续输出,就需要要解除订阅。


if ( subscription != null && ! subscription . isUnsubscribed ()) {

subscription . unsubscribe ();

}


Repeat


该操作符是重复的发射某个数据序列,并且可以自己设置重复的次数。当接收到onComplete()会触发重订阅再次重复发射数据,当重复发射数据次数到达后执行onCompleted()。


String [] strs = { "也许当初忙着微笑和哭泣" , "忙着追逐天空中的流星" };

Observable . from ( strs ). repeat ( 2 ).. subscribe ( new Subscriber () {

@ Override

public void onCompleted () {

Log . e ( TAG , "onCompleted: " );

}

@ Override

public void onError ( Throwable e ) {

Log . e ( TAG , "onError: " );

}

@ Override

public void onNext ( String s ) {

Log . e ( TAG , "onNext: " + s );

tv1 . append ( "\n" + s );

}

});


输出


onNext : 也许当初忙着微笑和哭泣

onNext : 忙着追逐天空中的流星

onNext : 也许当初忙着微笑和哭泣

onNext : 忙着追逐天空中的流星

onCompleted :


Defer


直到有观察者订阅时才创建Observable,并且为每个观察者创建一个新的Observable,该操作符能保证订阅执行时数据源是最新的数据。如下正常代码


String test = "旧数据" ;

Observable observable = Observable . just ( test );

Subscriber subscriber = new Subscriber () {

public String TAG = "RXJAVA" ;

@ Override

public void onCompleted () {

Log . e ( TAG , "onCompleted: " );

}

@ Override

public void onError ( Throwable e ) {

Log . e ( TAG , "onError: " );

}

@ Override

public void onNext ( Object o ) {

Log . e ( TAG , "onNext: " + o );

}

};

test = "新数据" ;

observable . subscribe







请到「今天看啥」查看全文


推荐文章
开发者全社区  ·  男朋友和女领导的聊天记录
17 小时前
开发者全社区  ·  十年又是一个轮回:从互联网+到AI+
2 天前
开发者全社区  ·  裸辞1天 vs 裸辞10天 vs 裸辞30天
2 天前
开发者全社区  ·  央企程序员到底香不香
2 天前
开发者全社区  ·  大佬与梁文锋第一次的接触
3 天前
华夏影像诊断中心  ·  骨性狮面,让你过目不忘
7 年前
请辩  ·  一周时间,能做多少事情?
7 年前