RxAndroid一个功能强大的框架,强大意味掌握成本比较高,断断续续研究了很久,今天写出来,输出才是更好的输入.
Rx并不是一种新的语言,而是一种普通的Java模式,类似于观察者模式(Observer Pattern),可以将它看作一个普通的Java类库,因此你可以立即使用RxJava。而RxAndroid是RxJava的一个针对Android平台的扩展,主要用于 Android 开发。
Rx核心就是观察者模式.
观察者模式,建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。
作为对这个通知的响应,每个观察者都将即时更新自己的状态,以与目标状态同步,这种交互也称为发布-订阅(publishsubscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅它并接收通
代码中创建两个订阅者, 使用字符串输出信息.
在页面中, 观察者接收信息, 发送至主线程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() {
@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 observable = Observable.create(mObservableAction);
// 分发订阅信息
// Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
observable.observeOn(AndroidSchedulers.mainThread());
//观察目标和观察者绑定/订阅
observable.subscribe(mToastSubscriber);
//观察目标和观察者绑定/订阅
observable.subscribe(mTextSubscriber);
}
// 订阅者, 接收字符串, 修改控件
//而被通知的对象称为观察者
private Subscriber mTextSubscriber = new Subscriber() {
@Override public void onCompleted() {
}
@Override public void onError(Throwable e) {
}
@Override public void onNext(String s) {
mTvText.setText(s); // 设置文字
}
};
// 订阅者, 接收字符串, 提示信息
//而被通知的对象称为观察者
private Subscriber mToastSubscriber = new Subscriber() {
// 完成事件接受执行
@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!";
}
}
代码中的新方法,核心为了简化调用代码, 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的使用方法.
*
* 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 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 obShow = Observable.just(sayMyName());
//观察目标和观察者绑定/订阅
//映射, 对输入数据进行转换, 如大写.map属于可选参数
obShow.observeOn(AndroidSchedulers.mainThread())
.map(mUpperLetterFunc).subscribe(mTextViewAction);
//---------------------
// 单独显示数组中的每个元素
//获取输入数组, 转变单个元素分发.
Observable 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 mTextViewAction = new Action1() {
@Override
public void call(String s) {
mTvText.setText(s);
}
};
// Action设置Toast
private Action1 mToastAction = new Action1() {
@Override
public void call(String s) {
Toast.makeText(MoreActivity.this, s, Toast.LENGTH_SHORT).show();
}
};
// 设置映射函数
private Func1, Observable> mOneLetterFunc = new Func1, Observable>() {
@Override
public Observable call(List strings) {
return Observable.from(strings); // 映射字符串
}
};
// 设置大写字母
private Func1 mUpperLetterFunc = new Func1() {
@Override
public String call(String s) {
return s.toUpperCase(); // 大小字母
}
};
// 连接字符串
private Func2 mMergeStringFunc = new Func2() {
@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网络请求库配合的使用才会更加强大,后续接着写了