Rxjava 在项目中的简单使用
来源:互联网 发布:js 数组合计 编辑:程序博客网 时间:2024/05/18 02:26
防止重复点击
RxView.clicks(mBinding.btclick).throttleFirst(2, TimeUnit.SECONDS) .subscribe(new Consumer<Object>() { @Override public void accept(Object o) throws Exception { ToastUtils.showToast(TestActivity.this, "2秒内只能点击一次"); } });
监听输入框内容状态变化
RxTextView.textChanges(mBinding.etTest).skip(5).subscribe(new Consumer<CharSequence>() { @Override public void accept(CharSequence charSequence) throws Exception { if(!TextUtils.isEmpty(charSequence.toString())){ ToastUtils.showToast(TestActivity.this,"输入框不为空"); }else{ ToastUtils.showToast(TestActivity.this,"输入框为空"); } } });
这里的skip(long count)里面的参数的意思是当输入框内容第一次到达count数量时候,开始进行输入状态监听。
如果有需要监听多个EditText的内容变化时候,可以这么写:
Observable<CharSequence> ob1 = RxTextView.textChanges(mBinding.etTest1).skip(1); Observable<CharSequence> ob2 = RxTextView.textChanges(mBinding.etTest2).skip(1); Observable.combineLatest(ob1, ob2, new BiFunction<CharSequence, CharSequence, Boolean>() { @Override public Boolean apply(CharSequence charSequence, CharSequence charSequence2) throws Exception { return charSequence.length()>5 && charSequence2.length()>10; } }).subscribe(new Consumer<Boolean>() { @Override public void accept(Boolean aBoolean) throws Exception { if(aBoolean) { Log.d("数量", "符合要求"); } } });
延迟任务
mBinding.btclick.setOnClickListener( v->{ Observable.timer(3, TimeUnit.SECONDS).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { ToastUtils.showToast(TestActivity.this,"3秒延迟执行"); } }); });
异步填充集合
private List<String> mList; private Disposable disposable;disposable = Observable.create(new ObservableOnSubscribe<TaskItem>() { @Override public void subscribe(ObservableEmitter<TaskItem> e) throws Exception { for (int i = 0; i < 10; i++) { TaskItem item = new TaskItem("123456789"+i,123456789,987654321, new Random().nextBoolean()); e.onNext(item); } } }).subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<TaskItem>() { @Override public void accept(TaskItem taskItem) throws Exception { mList.add(taskItem); } });
基本写法
Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { for (int i = 0; i < 10; i++){ e.onNext(i); } e.onComplete(); } }).subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { Log.d("测试数量","disPosablle"); } @Override public void onNext(Integer integer) { Log.d("测试数量",integer.toString()); } @Override public void onError(Throwable e) { Log.d("测试数量",e.toString()); } @Override public void onComplete() { Log.d("测试数量","onComplete"); } });
基本类型转换(map)
/** * map * 基本类型转换 一对一 * just(T...)将传入的参数依次发送 * from(T[])/from(Iterable<? extends T>)将传入的数组或者Iterable拆分成Java对象依次发送 */ Observable.just(1, 2, 3, 4, 5) .map(new Function<Integer, String>() { @Override public String apply(Integer integer) throws Exception { return "This is" + integer; } }).subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { System.out.println(s); } });
遍历集合取数据
Observable.fromIterable(list).flatMap(new Function<TaskItem, ObservableSource<? extends String>>() { @Override public ObservableSource<? extends String> apply(TaskItem taskItem) throws Exception { return Observable.just(taskItem.getTaskNum()); } }).subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { System.out.println(s); } });
过滤分组
{ Observable.fromIterable(list).groupBy(new Function<TaskItem, Boolean>() { @Override public Boolean apply(TaskItem taskItem) throws Exception { return taskItem.isChecked(); } }).subscribe(new Consumer<GroupedObservable<Boolean, TaskItem>>() { @Override public void accept(GroupedObservable<Boolean, TaskItem> booleanTaskItemGroupedObservable) throws Exception { if (booleanTaskItemGroupedObservable.getKey()){ booleanTaskItemGroupedObservable.subscribe(new Consumer<TaskItem>() { @Override public void accept(TaskItem taskItem) throws Exception { System.out.print("boolean值" + booleanTaskItemGroupedObservable.getKey()+": "); System.out.println(taskItem); } }); }else{ booleanTaskItemGroupedObservable.subscribe(new Consumer<TaskItem>() { @Override public void accept(TaskItem taskItem) throws Exception { System.out.print("boolean值" + booleanTaskItemGroupedObservable.getKey()+": "); System.out.println(taskItem); } }); } } }); }
在consumer端再次订阅的时候,相当于直接在上一次订阅的基础上继续订阅,在此之前中的方法不会执行,错误示例如下:
{ Observable.fromIterable(list).groupBy(new Function<TaskItem, Boolean>() { @Override public Boolean apply(TaskItem taskItem) throws Exception { return taskItem.isChecked(); } }).subscribe(new Consumer<GroupedObservable<Boolean, TaskItem>>() { @Override public void accept(GroupedObservable<Boolean, TaskItem> booleanTaskItemGroupedObservable) throws Exception { if (booleanTaskItemGroupedObservable.getKey()) { booleanTaskItemGroupedObservable.subscribe(new Consumer<TaskItem>() { //这里打印只会执行一次 以后不会再次打印 System.out.print("boolean值" + booleanTaskItemGroupedObservable.getKey() + ": "); @Override public void accept(TaskItem taskItem) throws Exception { System.out.println(taskItem); } }); } else { booleanTaskItemGroupedObservable.subscribe(new Consumer<TaskItem>() { System.out.print("boolean值" + booleanTaskItemGroupedObservable.getKey() + ": "); @Override public void accept(TaskItem taskItem) throws Exception { System.out.println(taskItem); } }); } } }); }
点击事件
RxView.clicks(mBinding.btclick).subscribe(new Consumer<Object>() { @Override public void accept(Object s) throws Exception { ToastUtils.showToast(TestActivity.this,"这是点击事件"); } });
这里注意,Consumer里的方法不能随便更改,会报找不到方法的错误,后期我正常使用的时候,有新发现我会再补充。
过滤器(filter)
RxView.clicks(mBinding.btclick).subscribe(v -> { Observable.fromIterable(list).filter(new Predicate<TaskItem>() { @Override public boolean test(TaskItem taskItem) throws Exception { return taskItem.isChecked(); } }).subscribe(new Consumer<TaskItem>() { @Override public void accept(TaskItem consumer) throws Exception { System.out.println(consumer.getTaskNum()); } }); });
filter里的匿名内部类的实现返回的是一个boolean值,这里作为判断依据筛选出需要被发送的数据。
发送前n个元素(take)
RxView.clicks(mBinding.btclick).subscribe(v->{ Observable.fromIterable(list).take(5).filter(new Predicate<TaskItem>() { @Override public boolean test(TaskItem taskItem) throws Exception { return taskItem.isChecked(); } }).subscribe(new Consumer<TaskItem>() { @Override public void accept(TaskItem con) throws Exception { System.out.println(con.getTaskNum()); } }); });
分组(groupBy)
上一个示例是有点小问题的,但是也可以使用,排序上达不到要求,这里补充一下
RxView.clicks(mBinding.btclick).subscribe(v->{ Observable<GroupedObservable<String,TestItem>> observable = Observable.fromIterable(testList).groupBy(new Function<TestItem, String>() { @Override public String apply(TestItem testItem) throws Exception { return testItem.getPlace(); } }); Observable.concat(observable).subscribe(new Consumer<TestItem>() { @Override public void accept(TestItem testItem) throws Exception { System.out.println("小区:"+testItem.getName()+"; 房源描述:"+testItem.getPlace()+"房屋价格"+testItem.getPrice()); } }); });
需要有分组的依据,类似于冒泡排序,找到一个就以当前下标对应的数值作为初始分组,往后找寻与它在同一分组的数值下标,并把对应的下标和数值移到当前下标的下一个位置。
组合(merge)
String[] letters = new String[]{"A","B","C","D","E","F","G","H"}; RxView.clicks(mBinding.btclick).subscribe( v->{ Observable<String> letter = Observable.interval(300, TimeUnit.MILLISECONDS) .map(new Function<Long, String>() { @Override public String apply(Long aLong) throws Exception { return letters[aLong.intValue()]; } }).take(letters.length); Observable<Long> number = Observable.interval(500,TimeUnit.MILLISECONDS) .take(5); Observable.merge(letter,number).subscribe(new Consumer<Serializable>() { @Override public void accept(Serializable serializable) throws Exception { System.out.println(serializable); } }); });
这里组合的意思,是按照发送元素的时间先后依次组合的。
插入数据(startWitch)
这里只能在源Observable发送数据前插入数据
插入数据(concat)
这里与startWitch的不同在于concat严格按照Observable的先后次序插入数据
String[] letters = new String[]{"A","B","C","D","E","F","G","H"}; RxView.clicks(mBinding.btclick).subscribe( v->{ Observable<String> letter = Observable.interval(300, TimeUnit.MILLISECONDS) .map(new Function<Long, String>() { @Override public String apply(Long aLong) throws Exception { return letters[aLong.intValue()]; } }).take(letters.length); Observable<Long> number = Observable.interval(500,TimeUnit.MILLISECONDS) .take(5); Observable.concat(letter,number).subscribe(new Consumer<Serializable>() { @Override public void accept(Serializable serializable) throws Exception { System.out.println(serializable); } }); });
这里会等到前一个(letter)数据发送完成后才会发送后面(number)的数据
组合发射(zip)
/*** 这里接着上面的,Observable还是用上面的*/ Observable.zip(letter, number, new BiFunction<String, Long, String>() { @Override public String apply(String s, Long aLong) throws Exception { return s +aLong; } }).subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(String s) { System.out.println(s); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } });
需要注意的是,zip组合的时候,当其中的某一个Observable发送元素出现异常时,另一个也会停止发送。
combineLatest
combineLatest(Observable, Observable, Func2)用于将两个Observale最近发射的数据已经Func2函数的规则进展组合。
List<String> strings1 = new ArrayList<String>() {{ add("你好");add("很好"); add("非常好"); }}; List<String> strings2 = new ArrayList<String>() {{ add("你hen好");add("很hen好"); add("hen非常好"); }}; RxView.clicks(mBinding.btclick).subscribe(v -> { Observable<String> s1 = Observable.interval(1,TimeUnit.SECONDS) .map(new Function<Long, String>() { @Override public String apply(Long aLong) throws Exception { return strings1.get(aLong.intValue()); } }).take(strings1.size()); Observable<String> s2 = Observable.interval(1,TimeUnit.SECONDS) .map(new Function<Long, String>() { @Override public String apply(Long aLong) throws Exception { return strings2.get(aLong.intValue()); } }).take(strings2.size()); //这里take表示发送的元素个数 去掉会报错关闭页面 Observable.combineLatest(s1, s2, new BiFunction<String, String, String>() { @Override public String apply(String s, String s2) throws Exception { return "name"+ s + "page" +s2; } }).subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { System.out.println(s); } }); });
阅读全文
0 0
- Rxjava 在项目中的简单使用
- RxJava在Android中的简单用例
- RXJAVA 在android 项目中的借鉴经验
- Rxjava中的range的简单使用。
- retrofit2 RxJava在android中的使用
- RxJava+Retrofit+OkHttp组合在网络请求中的简单配置
- Retrofit2+RxJava+OkHttp项目直接使用(简单快捷)
- Ehcache 初探(在项目中的简单使用)
- Git在项目协同开发中的简单使用
- ActiveMQ的在实际项目中的简单使用
- 消息队列Active mq在Maven项目中的简单使用
- Rxjava+Retrofit 简单使用
- retrofit2+RxJava简单使用
- RxJava的简单使用
- 摘要rxjava简单使用
- RxJava的简单使用
- Retrofit+Rxjava简单使用
- Rxjava的简单使用
- android 调用极光推送SDK设置Tag和Alias工具类——java Web调用极光推送web SDK 发送推送消息工具类
- Linux设备驱动模型探究--1(kobject)
- XML文件约束之DTD详解以及xml文件的dtd描述文件本地化
- CentOS7.0 MariaDB 安装配置后使用远程工具SQLyog 错误1130(远程连接mysql 授权)
- Java设计模式--适配器模式【Adapter Pattern】
- Rxjava 在项目中的简单使用
- Linux下关于进程的命令整理
- android 控件中文乱码 警告乱码等解决 笔记
- 如何找到学术期刊的“大牛”
- 58 同城 iOS 客户端 IM 系统演变历程
- 通过CRT查找某个文件所在路径
- Java集合
- mint-ui —— action sheet的使用
- Qtree树链剖分