一:什么是RxJava
Rx是响应式编程的意思,本质是观察者模式,是以观察者(Observer)和订阅者(Subscriber)为基础的一部响应方式。
在Android编程时, 经常会使用后台线程, 那么就可以使用这种方式. 目前的异步编程方式都会导致一些问题, 如
1. Asynctasks can easily lead to memory leaks. 2. CursorLoaders with a ContentProvider require a large amount of configuration and boilerplate code to setup. 3. Services are intended for longer running background tasks and not fast-finishing operations, such as making a network call or loading content from a database. 4. 访问网络接口调用返回数据,尤其在使用接口回调时候,处理数据很麻烦
RxJava 有四个基本概念:Observable(被观察者)、Observer(观察者)、subscribe(订阅)、事件。
Observable 和 Observer 通过 subscribe()方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知Observer。
二: 传统观察者模式
最简单的例子就是:警察抓小偷,警察需要在小偷伸手左岸的时候实施抓捕。在这个例子里,警察是观察者,小偷是被观察者,警察需要时刻盯着小偷的一举一动,才能保证不会搂过任何瞬间。
现在我们就写两个demo,来模拟警察抓小偷的情景(1.用普通的方式 2.用java自带api)
1)自定义方法
- 定义一个观察者接口
- 定义一个被观察这接口
- 分别实现他们
被观察者接口
public interface Watched {
public void addWatcher(Watcher watcher);
public void removeWatcher(Watcher watcher);
public void notifyWatchers(String str);
}
观察者接口
public interface Watcher {
public void update(String str);
}
被观察者接口实现 (小偷
)
public class ConcreteWatched implements Watched {
private List<Watcher> list = new ArrayList<>();
@Override
public void addWatcher(Watcher watcher) {
list.add(watcher);
}
@Override
public void removeWatcher(Watcher watcher) {
list.remove(watcher);
}
@Override
public void notifyWatchers(String str) {
for (Watcher watcher : list) {
watcher.update(str);
}
}
}
观察者接口实现(警察
)
public class ConcreteWatcher implements Watcher {
@Override
public void update(String str) {
System.out.println(str);
}
}
测试调用
public class Test {
public static void main(String[] args) throws Exception{
Watched xiaoming = new ConcreteWatched();
Watcher watcher1 = new ConcreteWatcher();
Watcher watcher2 = new ConcreteWatcher();
Watcher watcher3 = new ConcreteWatcher();
xiaoming.addWatcher(watcher1);
xiaoming.addWatcher(watcher2);
xiaoming.addWatcher(watcher3);
xiaoming.notifyWatchers("我要偷东西了");
}
}
2)java API实现
创建一个被观察者
public class SimpleObservable extends Observable {
private int data = 0;
public int getData(){
return data;
}
public void setData(int i){
if (this.data!=i){
this.data = i;
setChanged();//发生改变
notifyObservers();//通知观察者,表示状态发生改变
}
}
}
创建一个观察者
public class SimpleObserver implements Observer {
public SimpleObserver(SimpleObservable observable) {
observable.addObserver(this);
}
//当被观察者状态发生改变的时候会调用
public void update(Observable observable, Object object) {
System.out.println("data is changed:" + ((SimpleObservable) observable).getData());
}
}
测试类
public class MyTest {
public static void main(String[] args) throws Exception {
SimpleObservable simple = new SimpleObservable();
SimpleObserver observer = new SimpleObserver(simple);
simple.setData(1);
simple.setData(2);
simple.setData(2);
simple.setData(3);
}
}
三: 环境配置
app 下的 build.gradle
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
...
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
}
整个工程下的 build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
classpath 'me.tatarka:gradle-retrolambda:2.5.0'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
免责声明:一切学习资料都是从网上获得,只是自己做了自己的总结和记录