RxJava学习;数据转换、线程切换;
Observable(被观察者,发射器)发送数据:
just:发送单个的数据;
Observable.just("cui","chen","bo")
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.i(TAG, "accept: "+s);
}
});
Log:
04-27 22:44:05.988 7317-7317/com.ccb.pactera.rxdemo I/MainActivity: accept: cui
04-27 22:44:05.988 7317-7317/com.ccb.pactera.rxdemo I/MainActivity: accept: chen
04-27 22:44:05.988 7317-7317/com.ccb.pactera.rxdemo I/MainActivity: accept: bo
fromIterable:发送集合类型的数据;
List<String> datas = Arrays.asList("H","W","Rx");
Observable.fromIterable(datas)
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String value) {
Log.i(TAG, "onNext: "+value);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
Log:
04-27 22:44:05.988 7317-7317/com.ccb.pactera.rxdemo I/MainActivity: onNext: H
04-27 22:44:05.988 7317-7317/com.ccb.pactera.rxdemo I/MainActivity: onNext: W
04-27 22:44:05.988 7317-7317/com.ccb.pactera.rxdemo I/MainActivity: onNext: Rx
数据转换:
map:一对一的转换;
final Integer icon = R.mipmap.ic_launcher_round;
//数据转换
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(icon);
e.onComplete();
}
})
.map(new Function<Integer, Drawable>() {
@Override
public Drawable apply(Integer integer) throws Exception {
return getResources().getDrawable(integer);
}
})
.subscribe(new Observer<Drawable>() {
@Override
public void onSubscribe(Disposable d) { } @Override
public void onNext(Drawable value) {
ImageView iv = new ImageView(MainActivity.this);
iv.setImageDrawable(value);
} @Override
public void onError(Throwable e) { } @Override
public void onComplete() { }
});
flatMap:一对多的转换;
public class Course {
private String name;
private int id;
public Course(String name, int id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
public class Student {
private String name;
private ArrayList<Course> courses;
public Student(String name, ArrayList<Course> courses) {
this.name = name;
this.courses = courses;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList<Course> getCourses() {
return courses;
}
public void setCourses(ArrayList<Course> courses) {
this.courses = courses;
}
}
Course yuwen = new Course("语文", 1);
Course shuxue = new Course("数学", 2);
Course yingyu = new Course("英文", 3);
Course lishi = new Course("历史", 4);
Course zhengzhi = new Course("政治", 5);
Course xila = new Course("希腊语", 6);
ArrayList<Course> course1 = new ArrayList<>();
course1.add(yuwen);
course1.add(shuxue);
course1.add(yingyu);
course1.add(lishi);
course1.add(zhengzhi);
course1.add(xila);
Student zhangsan = new Student("zhangsan", course1);
Observable.just(zhangsan)
.flatMap(new Function<Student, ObservableSource<Course>>() {
@Override
public ObservableSource<Course> apply(Student student) throws Exception {
return Observable.fromIterable(student.getCourses());
}
})
.subscribe(new Consumer<Course>() {
@Override
public void accept(Course course) throws Exception {
Log.i(TAG, "accept: "+course.getName());
}
});
Log:
04-27 23:12:50.084 11652-11652/? I/MainActivity: accept: 语文
04-27 23:12:50.084 11652-11652/? I/MainActivity: accept: 数学
04-27 23:12:50.084 11652-11652/? I/MainActivity: accept: 英文
04-27 23:12:50.084 11652-11652/? I/MainActivity: accept: 历史
04-27 23:12:50.084 11652-11652/? I/MainActivity: accept: 政治
04-27 23:12:50.084 11652-11652/? I/MainActivity: accept: 希腊语
线程切换:
默认:
Observable.just("CCB")
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.i(TAG, "accept: ---"+s+"--线程--"+Thread.currentThread());
}
});
Log:
MainActivity: accept: ---CCB--线程--main (主线程);
添加subscribeOn(Schedulers.io());后;Log:MainActivity: accept: ---CCB--线程--RxCachedThreadScheduler-1 (子线程)
Observable.just("CCB")
.subscribeOn(Schedulers.io())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.i(TAG, "accept: ---"+s+"--线程--"+Thread.currentThread());
}
});
再添加: .observeOn(AndroidSchedulers.mainThread())后;log:MainActivity: accept: ---CCB--线程--main (主线程);
Observable.just("CCB")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.i(TAG, "accept: ---"+s+"--线程--"+Thread.currentThread());
}
});
这样我们就可以把一些耗时的操作(加载图片、网络请求)放在子线程,然后更新界面的时候再切换到主线程;各种线程间的切换只需要一行代码就可以搞定,而且链式调用,思路清晰;
* Schedulers.newThread(): 总是启用新线程,并在新线程执行操作。
* Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。
* Schedulers.computation(): 计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。
* AndroidSchedulers.mainThread(): Android专用,它指定的操作将在 Android 主线程运行。
* 指定线程的方法:
* Observable.subscribeOn():指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程
* Observable.observeOn():指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
OK!Rxjava的线程切换以及数据转换就说完了。
RxJava学习;数据转换、线程切换;的更多相关文章
- RxJava 操作符 on和doOn 线程切换 调度 Schedulers 线程池 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- RxJava学习入门
RxJava是什么 一个词:异步. RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-bas ...
- Day035--Python--管道, Manager, 进程池, 线程切换
管道 #创建管道的类: Pipe([duplex]):在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象,强调一点:必须在产生Process ...
- python自动化开发学习 进程, 线程, 协程
python自动化开发学习 进程, 线程, 协程 前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...
- EventBus 消息的线程切换模型与实现原理
一. 序 EventBus 是一个基于观察者模式的事件订阅/发布框架,利用 EventBus 可以在不同模块之间,实现低耦合的消息通信. EventBus 因为其使用简单且稳定,被广泛应用在一些生产项 ...
- EventBus 线程切换原理
主要问题其实只有两个,其一:如何判断当前发送事件的线程是否是主线程:其二:如何在接收事件时指定线程并执行: 一个一个来看. 1.如何判断是否在主线程发送 EventBus在初始化的时候会初始化一个Ma ...
- 浅谈linux线程切换问题
http://www.jb51.net/article/102059.htm 处理器总处于以下状态中的一种: 1.内核态,运行于进程上下文,内核代表进程运行于内核空间 2.内核态,运行于中断上下文,内 ...
- linux线程切换和进程切换
进程切换分两步: 1.切换页目录以使用新的地址空间 2.切换内核栈和硬件上下文 对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的. ...
- linux线程切换问题
处理器总处于以下状态中的一种: 1.内核态,运行于进程上下文,内核代表进程运行于内核空间: 2.内核态,运行于中断上下文,内核代表硬件运行于内核空间: 3.用户态,运行于用户空间: 一个进程的上下 ...
随机推荐
- centos6 下 yum 升级php5 到 php7
一 [卸载老版本php] 1.查看老版本 2.卸载老版本 yum remove php* 本人使用一下方式卸载老版本 1)yum -y remove php* #这个命令可以卸载部分,但是清除不干净 ...
- Linux下安装CollabNetSubversionEdge
1.首先下载CollabNet Subversion,目前最新版本Subversion Edge 5.2.2 (Linux 64-bit),注意下载的时候需要注册下账号,才允许下载: 2.安装Coll ...
- 配置中心Client端
配置中心Client端 1.在Order工程中的Order-Server模块的pom.xml中增加 <dependency> <groupId>org.springframew ...
- [转]使用 Angular CLI 和 ng-packagr 构建一个标准的 Angular 组件库
使用 Angular CLI 构建 Angular 应用程序是最方便的方式之一. 项目目标 现在,我们一起创建一个简单的组件库. 首先,我们需要创建一个 header 组件.这没什么特别的,当然接下来 ...
- hadoop商业版本的选择介绍
记得刚接触到hadoop的时候跟大部分人一样都会抱怨hadoop的安装部署问题,对于一个新手来说这这的是个头疼的问题,可能需要花费一整天的时间才能把分布式环境安装配置好.在刚接触hadoop的一段时间 ...
- elasticsearch 基本操作
安装delete_by_query ,cd进/bin,执行./plugin install delete-by-query DELETE http://192.168.1.12:9200/dd ...
- IndexR
IndexR是由舜飞科技研发的实时OLAP系统.于 2017 年 1 月初正式开源,目前已经更新至 0.6.1 版本,其作者认为IndexR具有以下特点: 超大数据集,低查询延时(超大数据集由HDFS ...
- Vivado约束文件(XDC)的探究(2)
Vivado约束文件(XDC)的探究(2)
- 用DDE控制Word
DDE(Dynamic Data Exchange),称为动态数据交换.用于进程间的通讯,看看他如何来和Word交互. 在System页签下有TDdeClientConv组件,拖一个放到界面上,然后我 ...
- 实现java随机数Random的几招
一,在java.util这个包里面提供了一个Random的类,我们可以新建一个Random的对象来产生随机数,可以产生随机整数.随机float.随机double,随机long,这个也是我们经常用的一个 ...