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网络请求库配合的使用才会更加强大,后续接着写了
- RxAndroid的使用方式(一)
- RxAndroid 的使用方式
- 详细解析 RxAndroid 的使用方式
- 详细解析RxAndroid的使用方式
- 详细解析 RxAndroid 的使用方式
- 详细解析RxAndroid的使用方式
- 详细解析RxAndroid的使用方式
- 详细解析 RxAndroid 的使用方式
- RxJava,Rxandroid 2.0的使用方式
- [Android 知识点] RxAndroid的使用(一)
- RxAndroid 操作符使用<一>
- RXAndroid Single的使用
- Retrofit + RxAndroid的使用
- RxAndroid的使用
- RxAndroid的使用
- 分分钟学会RxAndroid的使用(一)
- RXAndroid之RxSharedPreference的使用
- RxAndroid 与 Retrofit的使用
- BZOJ4543: [POI2014]Hotel加强版 长链剖分
- 2640 2016东莞市特长生考试 子数整数
- Intellij Idea生成JavaDoc
- 七牛的时间戳防盗链go语言
- 分库分表珠讥
- RxAndroid的使用方式(一)
- vue组件化开发初体验-示例vue-loader-example学习记录
- rails callback介绍
- Android Bitmap保存 以及 屏幕截取工具类
- 【2016东莞信息特长生】字串距离
- Maven在默认的源码包的基础上增加自己定义的源码包
- OpenStack基础原理
- springMVC fromdata表单上传文件+ajax ajaxSetup loading效果
- highcharts图表 去掉highcharts的logo 改变y轴的刻度 改变背景颜色 去掉图例