observable 中的fliter 方法 传入一个Predicate对象 实现方法并返回一个boolean值。作用是 在interval 循环的时候 进行判断 如果返回结果为true 则执行onnNext 方法 否则继续循环;take方法需要传入一个int值作用是控制整个循环的次数。这是这两个方法的的作用。
项目中的需求 在一个循环判断的interval中加入一个次数限制。
一开始我直接吧take加载fliter之后 贴代码
Observable.interval(0, 1, TimeUnit.SECONDS).filter(new Predicate<Long>() { @Override public boolean test(Long aLong) throws Exception { Log.d("MainActivity", "Observable--->filter-->"+aLong); return aLong > 20; } }).take(10).observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()).subscribe(new Observer<Long>() { @Override public void onSubscribe(Disposable d) { Log.d("MainActivity", "Observable--->onSubscribe"); } @Override public void onNext(Long value) { Log.d("MainActivity", "Observable--->onNext--->" + value); } @Override public void onError(Throwable e) { Log.d("MainActivity", "Observable--->onError--->"); } @Override public void onComplete() { Log.d("MainActivity", "Observable--->onComplete--->"); } });
贴log
07-18 14:55:47.559 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onSubscribe
07-18 14:55:47.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->0
07-18 14:55:48.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->1
07-18 14:55:49.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->2
07-18 14:55:50.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->3
07-18 14:55:51.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->4
07-18 14:55:52.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->5
07-18 14:55:53.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->6
07-18 14:55:54.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->7
07-18 14:55:55.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->8
07-18 14:55:56.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->9
07-18 14:55:57.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->10
07-18 14:55:58.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->11
07-18 14:55:59.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->12
07-18 14:56:00.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->13
07-18 14:56:01.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->14
07-18 14:56:02.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->15
07-18 14:56:03.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->16
07-18 14:56:04.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->17
07-18 14:56:05.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->18
07-18 14:56:06.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->19
07-18 14:56:07.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->20
07-18 14:56:08.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->21
07-18 14:56:08.565 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->21
07-18 14:56:09.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->22
07-18 14:56:09.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->22
07-18 14:56:10.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->23
07-18 14:56:10.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->23
07-18 14:56:11.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->24
07-18 14:56:11.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->24
07-18 14:56:12.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->25
07-18 14:56:12.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->25
07-18 14:56:13.563 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->26
07-18 14:56:13.564 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->26
07-18 14:56:14.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->27
07-18 14:56:14.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->27
07-18 14:56:15.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->28
07-18 14:56:15.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->28
07-18 14:56:16.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->29
07-18 14:56:16.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->29
07-18 14:56:17.562 14811-14855/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->30
07-18 14:56:17.563 14811-14811/test.lixing.com.daggerapplication D/MainActivity: Observable--->onNext--->30
Observable--->onComplete--->
发现不是想要的结果。通过log分析fliter在返回false之后,后续的代码是不会执行的。 当返回结果为true之后,take才显示出效果来,进行了10次的次数限制。于是将take 放在fliter之前 代码就不贴了
贴log
07-18 14:59:43.975 15447-15447/? D/MainActivity: Observable--->onSubscribe
07-18 14:59:43.978 15447-15486/? D/MainActivity: Observable--->filter-->0
07-18 14:59:44.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->1
07-18 14:59:45.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->2
07-18 14:59:46.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->3
07-18 14:59:47.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->4
07-18 14:59:48.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->5
07-18 14:59:49.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->6
07-18 14:59:50.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->7
07-18 14:59:51.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->8
07-18 14:59:52.978 15447-15486/test.lixing.com.daggerapplication D/MainActivity: Observable--->filter-->9
07-18 14:59:52.980 15447-15447/test.lixing.com.daggerapplication D/MainActivity: Observable--->onComplete--->
判断进行了10次,没有返回true 所以就直接调用 onComplete 方法。
妥了 这才是需求的功能
特此立博,谨记。