【Android - 框架】之RxJava的使用
RxJava算是最新最常用的,也是程序员们最喜欢的框架之一了。
RxJava的核心由Observable(被观察者,事件源)和Subscriber(观察者)构成,Observable负责发出一系列事件,Subscriber处理这些事件。
一个Observble可以发出零个或多个事件,直到结束或出错。每发出一个事件,就会调用与之关联的所有观察者Subscriber的onNext()方法;如果中途出错,则会回调这个观察者的onError()方法;事件发布给所有观察者之后,会回调最后一个观察者的onCompleted()方法。
RxJava很像设计模式中的观察者模式,但有一点不同,就是当一个被观察者没有任何与之关联的观察者时,这个被观察者不会发出任何事件。
在Android中使用RxJava,需要先导入RxJava和RxAndroid的依赖:
compile 'io.reactivex:rxjava:1.2.2'
compile 'io.reactivex:rxandroid:1.2.1'
DEMO 1:
        Observable<String> observabele = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello RxJava");
                subscriber.onCompleted();
            }
        });
        Observer<String> observer = new Observer<String>() {
            @Override
            public void onCompleted() {
                System.out.println("-------------------->>>>Completed");
            }
            @Override
            public void onError(Throwable e) {
            }
            @Override
            public void onNext(String s) {
                System.out.println("------------onNext---------->>>>>>>" + s);
            }
        };
        observabele.subscribe(observer);
通过Observable的create()方法创建一个自定义的Observable被观察者,在参数传入的OnSubscribe内部类中通过调用子方法的Subscriber对象参数的onNext()、onError()、onCompleted()三个方法,操作与这个被观察者绑定的所有观察者。
通过new Observer()方法来创建一个观察者,需要实现onNext()、onError()、onCompleted()三个方法。
通过Observeable对象的subscribe()方法绑定一个观察者,此时这个观察者就可以接收到被观察者发送的消息了。
DEMO2:
    Observable<String> observable = Observable.just("Hello RxJava", "My", "Name");
        Action1<String> next = new Action1<String>() {
            @Override
            public void call(String s) {
                // onNext()中执行的代码
            }
        };
        Action1<Throwable> error = new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {
                // onError()中执行的代码
            }
        };
        Action0 completed = new Action0() {
            @Override
            public void call() {
                // onCompleted()中执行的代码
            }
        };
        observable.subscribe(next, error, completed);
Subscriber中的三个子方法可以拆分成两个Action1和一个Action0。onNext()和onError()两个方法对应的Action1,onCompleted()方法对应的是Action0。
Observable对象的subscribe()方法可以传入三个Action对象,即表示被观察者已经绑定了一个观察者,这个观察者是由这三个Action组成的。subscribe()方法有多个重载,可以只有一个onNext()方法的Action1,可以有一个onNext()方法的Action1和一个onError()方法的Action1,也可以像上面代码一样有三个Action。
Observable对象的just()方法可以有任意个参数,表示将这些对象逐个通过onNext()方法发送出去。
DEMO3:
        String[] array = {"Hello RxJava", "My", "Name"};
        Observable<String> observable = Observable.from(array);
        Action1<String> next = new Action1<String>() {
            @Override
            public void call(String s) {
                // onNext()中执行的代码
                System.out.println("----------------------->>>>>>>>>>" + s);
            }
        };
        Action1<Throwable> error = new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {
                // onError()中执行的代码
            }
        };
        Action0 completed = new Action0() {
            @Override
            public void call() {
                // onCompleted()中执行的代码
            }
        };
        observable.subscribe(next, error, completed);
Observable.from()方法和Observable.just()方法的效果是一样的,都是将一组数据逐个发送出去,区别是from()方法是将一个数组中的数据逐个发送,而just()方法是将各个参数中的数据进行逐个发送。
DEMO4:
Observable<String> observable = Observable
.just("Hello RxJava", "aaaa", "bbbbb", "aaaaaacccc")
.map(new Func1<String, String>() {
@Override
public String call(String s) {
return "string=========" + s;
}
}); Action1<String> next = new Action1<String>() {
@Override
public void call(String s) {
// onNext()中执行的代码
System.out.println("----------------------->>>>>>>>>>" + s);
}
}; Action1<Throwable> error = new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
// onError()中执行的代码
}
}; Action0 completed = new Action0() {
@Override
public void call() {
// onCompleted()中执行的代码
}
}; observable.subscribe(next, error, completed);
map方法是将just中的数据进行进一步的处理,例如,上面的代码中就是在每个字符串前面加了另一端字符串。
DEMO5:
        Observable.just("https://api.github.com/users/basil2style")
                .map(new Func1<String, String>() {
                    @Override
                    public String call(String s) {
                        StringBuffer result = null;
                        try {
                            URL url = new URL(s);
                            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                            connection.setRequestMethod("GET");
                            connection.setDoInput(true);
                            connection.connect();
                            int responseCode = connection.getResponseCode();
                            if (responseCode == 200) {
                                result = new StringBuffer();
                                BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
                                byte[] b = new byte[1024];
                                int len = -1;
                                while ((len = bis.read(b)) != -1) {
                                    result.append(new String(b, 0, len));
                                }
                                bis.close();
                            }
                        } catch (MalformedURLException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        System.out.println("------------------->>>>>" + result.toString());
                        return result.toString();
                    }
                })
                .map(new Func1<String, InfoData>() {
                    @Override
                    public InfoData call(String s) {
                        InfoData infoData = new InfoData();
                        try {
                            JSONObject object = new JSONObject(s);
                            infoData.setId(object.getInt("id"));
                            infoData.setUrl(object.getString("url"));
                            infoData.setType(object.getString("type"));
                            infoData.setName(object.getString("name"));
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        return infoData;
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<InfoData>() {
                    @Override
                    public void onCompleted() {
                        System.out.println("---------------------->>>>>>Completed");
                    }
                    @Override
                    public void onError(Throwable e) {
                        Toast.makeText(MainActivity.this, "获取网络数据失败", Toast.LENGTH_SHORT).show();
                    }
                    @Override
                    public void onNext(InfoData infoData) {
                        Toast.makeText(MainActivity.this, infoData.getName(), Toast.LENGTH_SHORT).show();
                    }
                });
这是用RxJava结合原生的JAVA API完成网络访问的代码,通过map()方法在不同的参数之间进行转换,最终得到InfoData对象并输出数据。
现在,开发人员更喜欢将RxJava和Retrofit结合使用,原因是RxJava可以设置一段代码执行的线程,这样就可以轻松的、解耦的替换Handler和AsyncTask进行异步数据的访问。
有关RxJava和Retrofit结合使用的案例我会写在我的下一个帖子中,敬请期待~~
【Android - 框架】之RxJava的使用的更多相关文章
- 【Android - 框架】之Retrofit+RxJava的使用
		
前几天分别对Retrofit和RxJava进行了总结,这个帖子打算把Retrofit结合RxJava使用的方法总结以下.有还不了解Retrofit或RxJava的朋友可以参考下面的帖子学习~ [And ...
 - App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南
		
面对越来越复杂的 App 需求,Google 官方发布了Android 框架组件库(Android Architecture Components ).为开发者更好的开发 App 提供了非常好的样本. ...
 - Android开发学习之路-Android中使用RxJava
		
RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...
 - 给 Android 开发者的 RxJava 详解
		
我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个 ...
 - Android 框架简介--Java环境(转)
		
==========================上=========================== 这里简单的介绍了Android的java环境基础,在后面一节中会结合具体的实例来理解这一节 ...
 - 【Android - 框架】之GreenDao的使用
		
上一篇博客([Android - 框架]之ORMLite的使用)中介绍了ORMLite的基本使用,今天我们来研究以下GreenDao的使用. GreenDao和ORMLite一样,都是基于ORM(Ob ...
 - IOS 与ANDROID框架及应用开发模式对照一
		
IOS 和ANDROID操作系统都是眼下流行的移动操作系统,被移动终端和智能设备大量採用,两者都採用了先进的软件技术进行设计,为了方便应用开发两者都採用了先进的设计模式. 两者在框架设计上都採用了什么 ...
 - Kotlin的扩展函数:扩展Android框架(KAD 08)
		
作者:Antonio Leiva 时间:Jan 11, 2017 原文链接:https://antonioleiva.com/extension-functions-kotlin/ 扩展函数是Kotl ...
 - 【Android 系统开发】Android框架 与 源码结构
		
一. Android 框架 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android运行环境层; -- 应用框架层; -- 应 ...
 
随机推荐
- MFC中cannot find the definition (implementation) of this function 解决方法
			
问题:使用vc6 在点击左侧class view中的一个方法实现时出现下面错误: cannot find the definition (implementation) of this func ...
 - php多行字符串输出
			
$content_header =<<<CONTENT_HEADER <section class="content-header"> <h ...
 - ThinkPHP HTML标签代码和UBB互相转换
			
1.UBB 转为 HTML TP的扩展里面自带一个ubb方法,用这个方法就能把用户输入的ubb格式代码转换为HTML标签的代码.这里用到的基本知识就是正则表达式啦,今天先不讲正则表达式. 来看一下TP ...
 - phpcms v9使用GET调用指定id文章内容、页面数据方法
			
不知道大家有没有相同的体会?在使用Phpcms V9建站调用数据的时候,基础的数据用默认的模板的调用语句就好了,但复杂不常见的数据怎么调用呢?我们技术可能会研究半天,怀着探索的精神不断尝试.孜孜不倦. ...
 - Centos + nginx + JBOSS AS 7 搭建Java web application
			
最近做了一个Java的web app,一直想在Centos环境中搭建一个完整的web服务器,现在开始动手. 先说说环境: 操作系统: Centos 6.3 WEB服务器: nginx-1.2.5 Ap ...
 - ASP.NET MVC轻教程 Step By Step 13——页面布局
			
一般在一个网站中页面会使用相同的结构和元素,如果每个页面都要重复添加这些元素,不仅繁琐更会给我们后期维护带来大麻烦.所以我们采用网页模板之类的技术,将固定不变的元素放入模板,同时留下一些占位符供页面各 ...
 - 10300 - Ecological Premium
			
Problem A Ecological Premium Input: standard input Output: standard output Time Limit: 1 second Memo ...
 - jQuery.Deferred对象
			
一.前言 jQuery1.5之前,如果需要多次Ajax操作,我们一般会使用下面的两种方式: 1).串行调用Ajax $.ajax({ success: function() { $.ajax({ su ...
 - [spring-framework]Spring定时器的配置和使用
			
开发中我们常常会做一些定时任务,这些任务有开始时间,并会按一定的周期或规则执行.如此我们在Java程序开发中使用定时器来处理定时任务. <!-- MessageRequestTask类中包含了m ...
 - javascript中神奇的(+)加操作符
			
javascript是一门神奇的语言,这没神奇的语言中有一个神奇的加操作符. 常用的加操作符我们可以用来做: 加法运算,例如:alert(1+2); ==>3 字符串连接,例如:alert(“a ...