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的更多相关文章

  1. RxJava系列3(转换操作符)

    RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...

  2. RxJava系列5(组合操作符)

    RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...

  3. RxJava系列4(过滤操作符)

    RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...

  4. RxJava【变换】操作符 map flatMap concatMap buffer MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. c/c++ 模板与STL小例子系列<二> 模板类与友元函数

    c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...

  6. UML系列03之 UML类图(二)

    概要 在"UML系列02之 UML类图(一) "中介绍了类图的基本构成--类的UML表示方法.本文是接着前文,继续对"UML的类图"中几种关系进行介绍.介绍的主 ...

  7. RxJava系列6(从微观角度解读RxJava源码)

    RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...

  8. NLP+词法系列(二)︱中文分词技术简述、深度学习分词实践(CIPS2016、超多案例)

    摘录自:CIPS2016 中文信息处理报告<第一章 词法和句法分析研究进展.现状及趋势>P4 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bce ...

  9. RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例

    之前写过一系列RxJava的文章,也承诺过会尽快有RxJava2的介绍.无奈实际项目中还未真正的使用RxJava2,不敢妄动笔墨.所以这次还是给大家分享一个使用RxJava1解决问题的案例,希望对大家 ...

随机推荐

  1. js解析地址栏参数

    /** * 获取地址栏中url后面拼接的参数 * eg: * 浏览器地址栏中的地址:http://1.1.1.1/test.html?owner=2db08226-e2fa-426c-91a1-66e ...

  2. 【C++】Item18. Make interfaces easy to use correctly and hard to use incorrectly

    接口容易被正确使用,不易被误用 c++简单工厂模式时,初级实现为ITest* CreateTestOld(), 然后用户负责释放返回的对象.如果忘记释放就会造成memory leak,所以在设计工厂接 ...

  3. 在CorelDRAW中的自定义彩虹笔刷创建迷幻背景

    在60年代的艺术形式中,迷幻艺术对设计和图形艺术的影响尤为重要.在下面这个CorelDRAW教程中我们主要使用图形纸工具和艺术笔工具创建一个迷幻风格的背景,在这之前我们需要先创建出一个彩虹笔刷. 1. ...

  4. JS模拟CSS3动画-贝塞尔曲线

    一.什么是贝塞尔曲线 1962年,法国工程师皮埃尔·贝塞尔(Pierre Bézier),贝塞尔曲线来为为解决汽车的主体的设计问题而发明了贝塞尔曲线.如今,贝赛尔曲线是计算机图形学中相当重要的一种曲线 ...

  5. CAD绘制一个图象标记对象(com接口VB语言)

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  6. ThinkPHP---TP功能类之上传

    [一]概论 (1)上传操作的核心操作:移动临时文件(move_upload_file),在ThinkPHP里封装了上传类Upload.class.php (2)上传类Upload.class.php代 ...

  7. Intel要在中国投35亿美金造这种闪存,3DxPoint技术牛在哪里?

    Repost: https://www.leiphone.com/news/201508/bbCUJqS2M3glCY3m.html 编者按: 今年的IDF上,Intel 再次强调了3DxPoint闪 ...

  8. UVA - 1619 Feel Good(扫描法)

    题目: 思路: 预处理出a[i]在哪个范围区间内是最小的,然后直接遍历a数组求答案就可以了. 这个预处理的技巧巧妙的用了之前的处理结果.(大佬tql) 代码: #include <bits/st ...

  9. Go:闭包

    闭包就是一个函数和与其相关的引用环境组合的一个整体(实体). package main import "fmt" func add() func(int) int { i := 0 ...

  10. FTP配置

    常用的匿名FTP配置项   anonymous_enable=YES           是否允许匿名用户访问   anon_umask=022                匿名用户所上传文件的权限 ...