public class LoginActivity extends BaseActivity implements LoginView { Handler handler = new Handler(); @Override protected int getLayoutId() { return R.layout.activity_main; } @Override protected void initDatas() { /** * 一、初始的RxJava */// rxJavaDemo(); /** * 二、简洁版的RxJava */// rxJavaDemo_concise(); /** * 三、用操做符来进行操做Rxjava */// rxJavaDemo_operator(); /** * 四、深的操做符号(*****) */// rxJavaDemo_operator_more(); /** * 五、更深的操做符号(主要是讲 onComplete()和onError() ) * 这两个函数用来通知订阅者,被观察的对象将中止发送数据以及为何中止(成功的完成或者出错了)。 * * 还有RxJava 线程调度的问题 */// rxJavaDemo_operator_more_more(); /*** * Rxjava 在Android 中应用 */ rxJavaDemo_operator_more_more_android(); } /** * 接着要介绍的就是AndroidObservable,它提供了跟多的功能来配合Android的生命周期。 * bindActivity()和bindFragment()方法默认使用AndroidSchedulers.mainThread()来执行观察者代码,这两个方法会在Activity或者Fragment结束的时候通知被观察者中止发出新的消息。 */ private void rxJavaDemo_operator_more_more_android() { } private void rxJavaDemo_operator_more_more() { Subscription a = Observable.just("这个在的线程是:").subscribeOn(Schedulers.io())//订阅者发生在 工做线程中 即io .observeOn(AndroidSchedulers.mainThread())//发生在主线程中 即 观察者 在 main线程中 .subscribe(s -> showMessagers(s)); //中止当前的操做 RxJava的另一个好处就是它处理unsubscribing的时候,会中止整个调用链。 // 若是你使用了一串很复杂的操做符,调用unsubscribe将会在他当前执行的地方终止。不须要作任何额外的工做!// a.unsubscribe(); new View(this).postDelayed(() -> a.unsubscribe(), 2000); } /** * 相比更加详细的操做符学习 */ private void rxJavaDemo_operator_more() {// Observable.from()方法,它接收一个集合做为输入,而后每次输出一个元素给subscriber:// ArrayList<String> list = new ArrayList<>();//// list.add("d");// list.add("ddddd");// String[] arrays = {"d", "b"};// Observable.from(list).subscribe(s -> showMessagers(s)); //将list数据给观察者 这个为比较复杂的写法了 getDbDatas().subscribe(listData -> { Observable.from(listData).subscribe(listSring -> showMessagers(listSring)); }); /** * 这个是用flatmap写的 相对来讲要简单不少 */ getDbDatas().flatMap(new Func1<List<String>, Observable<String>>() { @Override public Observable<String> call(List<String> strings) { return Observable.from(strings); } }).subscribe(s -> showMessagers(s)); /** * 用兰博啦来写就更简单了 */ getDbDatas().flatMap(listData -> Observable.from(listData)).subscribe(listString -> showMessagers(listString)); /** * 接着前面的例子,如今我不想打印URL了,而是要打印收到的每一个网站的标题。 * 问题来了,个人方法每次只能传入一个URL,而且返回值不是一个String, * 而是一个输出String的Observabl对象。使用flatMap()能够简单的解决这个问题。 */ getDbDatas().flatMap(stringList -> Observable.from(stringList)).flatMap(stringData -> getTitle(stringData)).subscribe(title -> showMessagers(title)); /** * filter()输出和输入相同的元素,而且会过滤掉那些不知足检查条件的。 * take()若是咱们只想要最多5个结果: * doOnNext()容许咱们在每次输出一个元素以前作一些额外的事情,好比这里的保存标题。 */ getDbDatas().flatMap(stringList -> Observable.from(stringList)).flatMap(stringData -> getTitle(stringData)).filter(title -> title != null).take(5).doOnNext(title -> saveTitle(title)).subscribe(title -> showMessagers(title)); } /** * 保存标题等操做 */ public void saveTitle(String t) { } /** * 根据 string 串来进行查询Title */ Observable<String> getTitle(String URL) { String data = "data"; return Observable.just(data); } /** * 返回Observable<String>数据 * * @return */ public Observable<String> getStringData() { return Observable.just("数据"); } /** * 获得Observable<List<String>>对象 * * @return */ public Observable<List<String>> getDbDatas() { List listData = new ArrayList(); listData.add("a"); listData.add("b"); listData.add("c"); listData.add("d"); return Observable.just(listData); } /** * 用RxJava中操做符来进行操做 map就是来进行对observable改变的 map()操做符就是用于变换Observable对象的 */ private void rxJavaDemo_operator() { Observable.just("这个是操做符的操做哦").map(s -> s + "demo").subscribe(s -> showMessagers(s)); Observable.just("操做符号哦222222").map(s -> s.hashCode()).subscribe(s -> showMessagers(s.toString()));//中间对 observable 进行改变 变成hash 值 Observable.just("操做符号哦3333复杂的").map(s -> s.hashCode()).map(i -> Integer.toString(i)).subscribe(s -> showMessagers(s));//连续两个map进行转接 } /** * 简洁版本的 RxJava */ private void rxJavaDemo_concise() { /** * 好比Observable.just就是用来建立只发出一个事件就结束的Observable对象,上面建立Observable对象的代码能够简化为一行 */ Observable<String> myObservable = Observable.just("这个是只发出一个事件的-->这个是RxJava"); /** * 接下来看看如何简化Subscriber,上面的例子中,咱们其实并不关心OnComplete和OnError,咱们只须要在onNext的时候作一些处理,这时候就可使用Action1类。 */ Action1<String> onNextAction = new Action1<String>() { @Override public void call(String s) { //至关于Subscriber中的接受 Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show(); } }; myObservable.subscribe(onNextAction); //其实上面的彻底能够写成这样的哦 Observable.just("结合到一块儿的写法").subscribe(new Action1<String>() { @Override public void call(String s) { Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show(); } }); //或者用lambda表达式的写法 这个就更简单了哦~~~~ Observable.just("lambda表达式的写法 看看星星").subscribe(s -> Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show()); } /** * Observable 被观察者 Subscribers 观察者 */ private void rxJavaDemo() { /** * 建立观察者模式 --> 被观察者 * * 一个Observable能够发出零个或者多个事件,知道结束或者出错。 * 每发出一个事件,就会调用它的Subscriber的onNext方法,最后调用Subscriber.onNext()或者Subscriber.onError()结束。 */ Observable<String> myObservable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("这是RxJava"); subscriber.onCompleted(); } }); /** * 接着咱们建立一个Subscriber来处理Observable对象发出的字符串。 * */ Subscriber<String> mySubscriber = new Subscriber<String>() { @Override public void onCompleted() { Toast.makeText(LoginActivity.this, "完成啦...", Toast.LENGTH_SHORT).show(); } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show(); } }; /** * 这里subscriber仅仅就是打印observable发出的字符串。 * 经过subscribe函数就能够将咱们定义的myObservable对象和mySubscriber对象关联起来,这样就完成了subscriber对observable的订阅。 */ myObservable.subscribe(mySubscriber); } @Override protected void initListeners() { } @Override protected void initViews(Bundle savedInstanceState) { } @Override public void showMessagers(String message) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); }