【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结合使用的案例我会写在我的下一个帖子中,敬请期待~~

时间: 2024-10-12 04:51:34

【Android - 框架】之RxJava的使用的相关文章

【Android - 框架】之Retrofit+RxJava的使用

前几天分别对Retrofit和RxJava进行了总结,这个帖子打算把Retrofit结合RxJava使用的方法总结以下.有还不了解Retrofit或RxJava的朋友可以参考下面的帖子学习~ [Android - 框架]之Retrofit的使用 [Android - 框架]之RxJava的使用 首先导入依赖: dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.andro

App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南

面对越来越复杂的 App 需求,Google 官方发布了Android 框架组件库(Android Architecture Components ).为开发者更好的开发 App 提供了非常好的样本.这个框架里的组件是配合 Android 组件生命周期的,所以它能够很好的规避组件生命周期管理的问题.今天我们就来看看这个库的使用. 通用的框架准则 官方建议在架构 App 的时候遵循以下两个准则: 关注分离 其中早期开发 App 最常见的做法是在 Activity 或者 Fragment 中写了大量

综合开源框架之RxJava/RxAndroid

* 一种帮助做异步的框架. 类似于 AsyncTask. 但其灵活性和扩展性远远强于前者. * 主页: https://github.com/ReactiveX/RxJava * 中文资料: * https://github.com/lzyzsd/Awesome-RxJava * https://www.zhihu.com/question/35511144 * 用途: * 异步操作 * 在程序逻辑异常复杂的情况下,仍然可以让代码的逻辑保持简洁 * 配置: 添加依赖: * compile 'io

一个实用的android框架(一)——架构

原文出处:http://saulmm.github.io/2015/02/02/A%20useful%20stack%20on%20android%20%231,%20architecture/ 原码github地址:https://github.com/saulmm/Material-Movies 作者:Saúl Molinero 译者注:这是最近接触到的一个关于安卓架构的项目,也是基于MVP的,分包上的想法和我比较契合.另外,该项目也是使用了Material Design,感觉比较新颖实用.

在Kotlin中使用注释处理Android框架 kapt

本教程介绍如何在 Kotlin 中使用依赖于注释处理的流行的 Android 框架和库. 在日常 Android 开发中,流行着数以千计的框架帮助我们提升开发效率. 使用 Kotlin 开发时仍然可以沿用这些框架,而且和使用 Java 同样简单. 本章教程将提供相关示例并重点介绍配置的差异. 教程以 Dagger. Butterknife. Data Binding. Auto-parcel 以及 DBFlow 为例(其它框架配置基本类似). 以上框架均基于注解处理方式工作:通过对代码注解自动生

给 Android 开发者的 RxJava 详解

作者:扔物线 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个月,我也发现国内越来越多的人开始提及 RxJava .有人说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』,另外更多的人表示:我真的百度了也谷歌了,但我还是想问: RxJava 到底是什么? 鉴于 RxJava 目前这种既火爆又神秘的现状,而我又在一年的使用

Android 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器aaa

MDPlayer万能播放器 MDPlayer,基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器,可以播放本地和在线视频,可以浏览宅男杀手妹纸图片,UI设计遵循 Material Design. GitHub地址:https://github.com/Dawish/MDPlayer UI浏览:         1.UI设计: 列表使用RecyclerView,item为CardView并设置rippl

Android框架设计模式(四)——Adapter Method

一适配器模式介绍 什么是适配器模式 定义 分类 适配器应用于什么场景 二Android框架中的适配器模式应用 ListViewBaseAdapter自定义View 通俗UML图 关键代码分析 ActivityBinderMediaPlayer 通俗UML图 关键代码分析 三适配器模式与其他模式的配合 适配器观察者模板策略组合 BaseAdapterListView自定义View 整体UML图 模式分析不同的视角决定 适配器观察者模板 Service Activity 自定义服务 整体UML图 模

IOS 与ANDROID框架及应用开发模式对比一

IOS 和ANDROID操作系统都是目前流行的移动操作系统,被移动终端和智能设备大量采用,两者都采用了先进的软件技术进行设计,为了方便应用开发两者都采用了先进的设计模式.两者在框架设计上都采用了什么技术?都采用了什么设计模式?两者设计思路和应用开发模式有什么异同呢? 两者都采用了框架模式. IOS 的框架称为Cocoa Touch. 框架提供两个作用,一是类的集合,每个类构建一个问题空间,并提供完整的解决方案和服务:二更重要的是框架中的类相互依赖构成一个整体,制订并实现整个应用程序的结构.框架定