RxAndroid的使用方式(一)

来源:互联网 发布:python hdfs 编辑:程序博客网 时间:2024/05/18 00:43

RxAndroid一个功能强大的框架,强大意味掌握成本比较高,断断续续研究了很久,今天写出来,输出才是更好的输入.

Rx是什么

Rx并不是一种新的语言,而是一种普通的Java模式,类似于观察者模式(Observer Pattern),可以将它看作一个普通的Java类库,因此你可以立即使用RxJava。而RxAndroid是RxJava的一个针对Android平台的扩展,主要用于 Android 开发。

Rx核心就是观察者模式.
观察者模式,建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
作为对这个通知的响应,每个观察者都将即时更新自己的状态,以与目标状态同步,这种交互也称为发布-订阅(publishsubscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅它并接收通

RxAndroid基础使用

代码中创建两个订阅者, 使用字符串输出信息.
在页面中, 观察者接收信息, 发送至主线程AndroidSchedulers.mainThread(), 再传递给订阅者, 由订阅者最终处理消息. 接收信息可以是同步, 也可以是异步.

package clwang.chunyu.me.testdetailrxandroid;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;import android.widget.Toast;import butterknife.Bind;import butterknife.ButterKnife;import rx.Observable;import rx.Subscriber;import rx.android.schedulers.AndroidSchedulers;/** * RxJava的基础讲解, 包含一个观察者(Observable), 两个订阅者(Subscriber). */public class SimpleActivity extends Activity {    @Bind(R.id.simple_tv_text) TextView mTvText;    //观察目标    // 观察事件发生,发生改变的对象称为观察目标    private Observable.OnSubscribe mObservableAction = new Observable.OnSubscribe<String>() {        @Override public void call(Subscriber<? super String> subscriber) {            subscriber.onNext(sayMyName()); // 发送事件           subscriber.onCompleted(); // 完成事件        }    };    @Override protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_simple);        ButterKnife.bind(this);        // 注册观察活动        Observable<String> observable = Observable.create(mObservableAction);        // 分发订阅信息        // Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。        observable.observeOn(AndroidSchedulers.mainThread());        //观察目标和观察者绑定/订阅        observable.subscribe(mToastSubscriber);         //观察目标和观察者绑定/订阅        observable.subscribe(mTextSubscriber);    }    // 订阅者, 接收字符串, 修改控件    //而被通知的对象称为观察者    private Subscriber<String> mTextSubscriber = new Subscriber<String>() {        @Override public void onCompleted() {        }        @Override public void onError(Throwable e) {        }        @Override public void onNext(String s) {            mTvText.setText(s); // 设置文字        }    };    // 订阅者, 接收字符串, 提示信息    //而被通知的对象称为观察者    private Subscriber<String> mToastSubscriber = new Subscriber<String>() {        // 完成事件接受执行        @Override public void onCompleted() {            Toast.makeText(SimpleActivity.this, "onCompleted",Toast.LENGTH_SHORT).show();        }        @Override public void onError(Throwable e) {        }        @Override public void onNext(String s) {         //   Toast.makeText(SimpleActivity.this, s, Toast.LENGTH_SHORT).show();        }    };    // 创建字符串    private String sayMyName() {        return "Hello, I am your friend, Spike11!";    }}

RxAndroid扩展使用

代码中的新方法,核心为了简化调用代码, Rx的写法可以是多种多样, 合理的写法会更加优雅.

package clwang.chunyu.me.testdetailrxandroid;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;import android.widget.Toast;import java.util.Arrays;import java.util.List;import butterknife.Bind;import butterknife.ButterKnife;import rx.Observable;import rx.android.schedulers.AndroidSchedulers;import rx.functions.Action1;import rx.functions.Func1;import rx.functions.Func2;/** * 更多的RxAndroid的使用方法. * <p> * Created by wangchenlong on 15/12/30. */public class MoreActivity extends Activity {    @Bind(R.id.simple_tv_text)    TextView mTvText;    final String[] mManyWords = {"Hello", "I", "am", "your", "friend", "Spike"};    final List<String> mManyWordList = Arrays.asList(mManyWords);    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_simple);        ButterKnife.bind(this);        // 添加字符串, 省略Action的其他方法, 只使用一个onNext.        //创建观察目标/just: 获取输入数据, 直接分发, 更加简洁, 省略其他回调.        Observable<String> obShow = Observable.just(sayMyName());        //观察目标和观察者绑定/订阅        //映射, 对输入数据进行转换, 如大写.map属于可选参数        obShow.observeOn(AndroidSchedulers.mainThread())                .map(mUpperLetterFunc).subscribe(mTextViewAction);//---------------------        // 单独显示数组中的每个元素        //获取输入数组, 转变单个元素分发.        Observable<String> obMap = Observable.from(mManyWords);        // 映射之后分发        obMap.observeOn(AndroidSchedulers.mainThread())                .map(mUpperLetterFunc).subscribe(mToastAction);//---------------------        // 优化过的代码, 直接获取数组, 再分发, 再合并, 再显示toast, Toast顺次执行.      //flatMap: 增大, 本意就是增肥, 把输入数组映射多个值, 依次分发.       //reduce: 简化, 正好相反, 把多个数组的值, 组合成一个数据.        Thread thread = new Thread(new Runnable() {            @Override            public void run() {                Observable.just(mManyWordList)                        // Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。                        .observeOn(AndroidSchedulers.mainThread())                        .flatMap(mOneLetterFunc)                        .reduce(mMergeStringFunc)                        .subscribe(mToastAction);//                try {//                    Thread.sleep(1000);//                } catch (InterruptedException e) {//                    e.printStackTrace();//                }            }        });        //开启线程        thread.start();    }    // Action类似订阅者, 设置TextView    private Action1<String> mTextViewAction = new Action1<String>() {        @Override        public void call(String s) {            mTvText.setText(s);        }    };    // Action设置Toast    private Action1<String> mToastAction = new Action1<String>() {        @Override        public void call(String s) {            Toast.makeText(MoreActivity.this, s, Toast.LENGTH_SHORT).show();        }    };    // 设置映射函数    private Func1<List<String>, Observable<String>> mOneLetterFunc = new Func1<List<String>, Observable<String>>() {        @Override        public Observable<String> call(List<String> strings) {            return Observable.from(strings); // 映射字符串        }    };    // 设置大写字母    private Func1<String, String> mUpperLetterFunc = new Func1<String, String>() {        @Override        public String call(String s) {            return s.toUpperCase(); // 大小字母        }    };    // 连接字符串    private Func2<String, String, String> mMergeStringFunc = new Func2<String, String, String>() {        @Override        public String call(String s, String s2) {            return String.format("%s %s", s, s2); // 空格连接字符串        }    };    // 创建字符串    private String sayMyName() {        return "Hello, I am your friend, Spike!";    }}

RxAndroid代码的基本使用,后续和Retrofit网络请求库配合的使用才会更加强大,后续接着写了

0 0
原创粉丝点击