RxJava的基本使用

TamaraICX 8年前
   <p>RxJava响应式函数编程也在Android开发中流行起来了,最大的好处的话就是,在程序逻辑异常复杂的情况下,仍然可以让代码的逻辑保持简洁.</p>    <p>现在就简单的介绍一下它的使用首先添加Rx相关的依赖</p>    <p>compile 'io.reactivex:rxjava:1.2.4'</p>    <p>compile 'io.reactivex:rxandroid:1.2.1'</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c6b824647a729211e358c9acd9779418.png"></p>    <p>Button监听事件.png</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c8413352ab35b3285ffdcb3c20935f2c.png"></p>    <p>RxJava.png</p>    <p>RxJava里面的被观察者Observable ,观察者Observer之间的关系,就像Button点击监听类似,Button通过setOnClickListener将Button与OnClickListener联系起来了.一旦Button被点击,OnClickListener就会执行onClick()方法,</p>    <p>同样的RxJava里面的Observable 通过subscribe 与Observer建立联系,一旦Observable 有触发一下操作,就会对应的执行onNext(),onCompleted();或者onNext(), onError():</p>    <pre>  <code class="language-java">* onNext():普通事件      * onCompleted():事件队列完结      * onError(): 事件队列异常</code></pre>    <p>借用之前有个大神和我说的一个案例,现有一个数组 String[] arr ={"abcd", "bcde", "cdef"}, 把其中以字母"a"开头的字符串找出来并加上"from Alpha",最后打印出新的字符串的长度</p>    <p>普通方法我们做法是这样的,</p>    <pre>  <code class="language-java">for (int i = 0; i < arr.length; i++) {            String temp = arr[i];            if (temp.startsWith("a")) {                temp += " from Alpha";                System.out.println("traditional:" + temp + temp.length());            }</code></pre>    <p>用RxJava写的话就是这样,而且这里Observer实际执行的方法的话就是onNext(),onCompleted();</p>    <pre>  <code class="language-java">Observable.from(arr)       //过滤       .filter(new Func1<String, Boolean>() {           @Override           public Boolean call(String s) {               return s.startsWith("a");           }           //订阅关联       })       .subscribe(new Observer<String>() {           @Override           public void onCompleted() {           }           @Override           public void onError(Throwable e) {           }           @Override           public void onNext(String s) {               //参数列表中的s就是数组arr中过滤出来满足条件的字符串了               String temp = s += " from Alpha";               System.out.println("RxJava:" + temp + temp.length());           }       });</code></pre>    <p>为了方便理解,我就举个例子(呵呵,就不用买栗子了,虽然有点强行,应该比直接看代码好理解),</p>    <p>Observable(被观察者)就像小偷,Observer(观察者)就像警察</p>    <p>首先小偷的关注的是美女的背包,在意的是背包里面的钱包,然后从背包挑出(filter)钱包,最后被警察观察到了(subscribe),然后(onNext)警察做出回应,逮捕小偷,得到小偷偷走的钱包</p>    <p>所以最后代码表示的话就是这样</p>    <pre>  <code class="language-java">小偷.from(美女背包)  //通过过滤器判断       .filter(new Func1<物品, 是否是钱包>() {           @Override           public Boolean call(物品 s) {               return 通过对物品观察触摸,判断是否为钱包;           }           //订阅关联       })       .subscribe(new 警察<物品>() {           @Override           public void onCompleted() {           }           @Override           public void onError(Throwable e) {           }           @Override           public void onNext(物品s) {               //参数列表中的s就是美女背包中挑选出来的钱包了          最后将得到的钱吧交回美女失主,然后和警察一起回警察局做笔录         ,然后美女爱上了警察...然后就没有然后了.....(自己YY去吧);           }       });</code></pre>    <ul>     <li>需要注意的是这里onNext()方法可能会执行多次如果数组arr里面有多个满足条件的字符串就会执行多次当然没有满足条件的就不会执行,但是onCompleted():事件队列完结方法只会执行一次</li>    </ul>    <ul>     <li> <p>相信有了上面的例子已经对RxJava有个大概印象了,</p> <p>现在总结下步骤吧:</p> <p>1.创建Observable(被观察者)</p> <p>Observable.just(T...) 参数为单个的</p> <p>Observable.from(T[]) / Observable.from(Iterable<? extends T>) 参数为数组或Iterable</p> <p>由于是数组所以用的是from().</p> <p>2.filter(过滤器)</p> <p>3.Observer(观察者)</p> <p>4.subscribe(订阅,建立联系)</p> <p>如果只想关心onNext方法可以直接用Action1,这样代码会简洁很多</p> <pre>  <code class="language-java">observable.subscribe(observer);  Observable.from(arr)      .filter(new Func1<String, Boolean>() {          @Override          public Boolean call(String s) {              return s.startsWith("a");          }      })      .subscribe(new Action1<String>() {          @Override          public void call(String s) {              String temp = s += " from Alpha";              System.out.println("RxJava:" + temp + temp.length());          }      });</code></pre> <p>当然这只是一点基本使用.</p> <p> </p> </li>    </ul>    <p> </p>    <p>来自:http://www.jianshu.com/p/5bb2446bde3f</p>    <p> </p>