RxJava系列之二 变换类操作符具体解释1
1.回想
上一篇文章我们主要介绍了RxJava , RxJava 的Observables和 RxJava的just操作符。以及RxJava一些经常使用的操作。
没看过的抓紧点我去看吧。
事实上RxJava有非常多的操作符, 而我们学过的just仅仅是创建类操作符的当中一种。
以后我会陆续介绍其它的创建类操作符。
文章代码地址:https://github.com/jiang111/RxJavaDemo
2. 变换类操作符之map
開始本篇文章的解说:
map操作符的详细使用方法。
map是属于变换操作符。它的作用是对序列的每一项都应用一个函数来变换Observable发射的数据序列(太官方了), 大白话就是你传递一个Observable,然后它返回给你还有一个Observable。
看图:
Map操作符对原始Observable发射的每一项数据应用一个你选择的函数,然后返回一个发射这些结果的Observable
RxJava将这个操作符实现为map函数。
这个操作符默认不在不论什么特定的调度器上执行。
给大家举个样例: 每一个模块传递一个url给底层网络请求您框架, 然后底层框架须要将url进行变换, 比方: 加入host。 那么我们就能够通过map来实现。
以下我们就通过map配合Rxandroid 写一个网络请求。在写代码之前请大家在gradle文件里加入 RxAndroid 的jar包 compile ‘io.reactivex:rxandroid:1.0.+’
代码採用了ButterKnife注解。 直接拷贝下来执行可能会报错,请先cloneproject,再执行。
public static final String HOST = "http://blog.csdn.net/";
@Bind(R.id.first_wb)
WebView mWb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Observable.just("jys1115/article/details/47428843").map(new Func1<String, String>() {
@Override
public String call(String s) {
return HOST + s;
}
}).map(new Func1<String, String>() {
@Override
public String call(String s) {
return doNetTask(s);
}
}).subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
mWb.loadDataWithBaseURL(HOST, s, "text/html", "utf-8", null);
}
});
}
private String doNetTask(String s) {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(s);
String result;
try {
HttpResponse response = client.execute(get);
if (200 == response.getStatusLine().getStatusCode()) {
result = EntityUtils.toString(response.getEntity(), HTTP.UTF_8);
} else {
result = "状态行非200";
}
} catch (Exception e1) {
result = e1.getStackTrace().toString();
}
return result;
}
代码就不用凝视了,非常easy。 代码中用到的Schedulers.newThread()和 AndroidSchedulers.mainThread() 相信大家都懂的, 以后的文章中我也会介绍到。
看结果:
好了, map是个好东西啊, 不要激动, 以下还有很多其它的好东西等待着我们去探索呢。
3. 变换类操作符之flatMap
突然, boss又出新需求了。刚刚我们写了个网络请求。 然后拿出全部请求的数据, 如今我们不须要那么多数据, 我们仅仅须要city字段和WD字段(执行过上段代码就知道了), 并且这次我不在仅仅给你一个url了。而是给你多个url, 写吧。
boss永远都是这种。
非常多人就開始想了。 那就写个for循环呗,我们最擅长了。哈哈,。 RxJava为我们提供了更方便的操作。
flatMap()操作符。
flatMap()操作符的作用是将Observable发射的数据集合变换为Observables集合。然后将这些Observable发射的数据平坦化的放进一个单独的Observable,还是太抽象了。
简单说就是将 一个List 或者数组中的每一条数据都 转换成一个 Observable对象。
那我们就開始写代码吧(代码是最好的老师):
public static final String HOST = "http://www.weather.com.cn";
List<String> values = new ArrayList<>();
private String TAG = "SecondActivity2";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
values.add("/adat/sk/101010100.html");
values.add("/adat/sk/101010100.html");
values.add("/adat/sk/101010100.html");
values.add("/adat/sk/101010100.html");
values.add("/adat/sk/101010100.html");
Observable.just(values).flatMap(new Func1<List<String>, Observable<?>>() {
@Override
public Observable<?> call(List<String> strings) {
return Observable.from(strings);
}
}).cast(String.class).map(new Func1<String, String>() {
@Override
public String call(String s) {
return doNetTaskForString(HOST + s); //取出想要的字段,这里我就不取出来了
}
}).subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.i(TAG, "value: " + s);
}
});
}
@NonNull
@Override
public int getContentView() {
return R.layout.activity_second2;
}
private synchronized String doNetTaskForString(String s) {
HttpClient client = new DefaultHttpClient();
Log.i(TAG, "url:" + s);
HttpGet get = new HttpGet(s);
String result;
try {
HttpResponse response = client.execute(get);
Log.i(TAG, "state code :" + response.getStatusLine().getStatusCode());
if (200 == response.getStatusLine().getStatusCode()) {
result = EntityUtils.toString(response.getEntity(), HTTP.UTF_8);
} else {
result = "状态行非200";
}
} catch (Exception e1) {
result = "抛出了异常" + e1.getMessage();
e1.printStackTrace();
}
return result;
}
结果(这次採取打log的形式):
这段代码里我们又用到的新的操作符 cast .
cast的作用就是 在发射之前强制将Observable发射的全部数据转换为指定类型。
看图:
4. 总结
好了,我们总结一下今天学习的内容。我们今天又学习了 两个操作符 flatMap cast, 复习了 just from map 操作符。
下次我们将通过几个栗子把 RxJava剩下的变换类的操作符讲完。 敬请期待吧。
文章代码地址:https://github.com/jiang111/RxJavaDemo
欢迎关注我的微信公众号:androidesigner
通过微信扫描二维码就可以关注。
RxJava系列之二 变换类操作符具体解释1的更多相关文章
- RxJava系列3(转换操作符)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...
- RxJava系列5(组合操作符)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...
- RxJava系列4(过滤操作符)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...
- RxJava【变换】操作符 map flatMap concatMap buffer MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- c/c++ 模板与STL小例子系列<二> 模板类与友元函数
c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...
- UML系列03之 UML类图(二)
概要 在"UML系列02之 UML类图(一) "中介绍了类图的基本构成--类的UML表示方法.本文是接着前文,继续对"UML的类图"中几种关系进行介绍.介绍的主 ...
- RxJava系列6(从微观角度解读RxJava源码)
RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...
- NLP+词法系列(二)︱中文分词技术简述、深度学习分词实践(CIPS2016、超多案例)
摘录自:CIPS2016 中文信息处理报告<第一章 词法和句法分析研究进展.现状及趋势>P4 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bce ...
- RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例
之前写过一系列RxJava的文章,也承诺过会尽快有RxJava2的介绍.无奈实际项目中还未真正的使用RxJava2,不敢妄动笔墨.所以这次还是给大家分享一个使用RxJava1解决问题的案例,希望对大家 ...
随机推荐
- Previous operation has not finished; run 'cleanup' if it was interrupted.SVN报错
原因: 错误的原因是SVN管理的文件夹改名.删除文件太过频繁,导致有操作挂起了. 解决方式: 1.百度sqlite3.exe并下载. 2.将该文件解压到项目根目录下的.svn文件夹中. 3.打开cmd ...
- spark web ui
spark UI 界面:http://www.cnblogs.com/xing901022/p/6445254.html 几个概念的解释:http://blog.csdn.net/jiangwlee/ ...
- DIV自动居中
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Java基础(三)--final关键字
final通常是指"不可改变的",例如我们使用的常量 通常可以有三种使用情况: 一.final修饰数据 如果final修饰数据,也就是通常所说的常量,从字面上看,常量就是不能修改的 ...
- vsCode scss安装
点击在settings.json中编辑写入代码: { /** Easy Sass 插件 **/ "easysass.formats": [ { "format" ...
- Ice Cream Tower(The 2016 ACM-ICPC Asia China-Final Contest 二分&贪心)
题目: Mr. Panda likes ice cream very much especially the ice cream tower. An ice cream tower consists ...
- 阿里云ECS屏蔽25端口,官方建议使用465 SSL端口发送邮件
阿里云ECS VPC网络,搭建了zabbix,想通过三方邮件系统发送邮件,本机开虚拟机测试发邮件一切正常,到阿里ECS的时候邮件各种发不出去,到处找原因,最后度娘告诉了我真想,原来阿里把25端口屏蔽 ...
- Python学习-字符串函数操作1
字符串的函数操作 capitalize():可以将字符串首字母变为大写 返回值:首字符大写后的新字符串 str = "liu" print(str.capitalize()); / ...
- Scrapy用Cookie实现模拟登录
模拟登录是爬取某些站点内容的一个关键,有些网站(特别是论坛类),不登录的话,一个数据也拿不到. 模拟登录有这样几个关键: 弄清楚登录的url一些网站打开出现登录的页面,地址栏大多数不是登录提交表单的u ...
- Python利用带权重随机数解决抽奖和游戏爆装备问题
关于带权随机数 为了帮助理解,先来看三类随机问题的对比: 1.已有n条记录,从中选取m条记录,选取出来的记录前后顺序不管. 实现思路:按行遍历所有记录,约隔n/m条取一个数据即可 2.在1类情况下,还 ...