RxJava 学习笔记(一)

一:什么是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 }

免责声明:一切学习资料都是从网上获得,只是自己做了自己的总结和记录

你可能感兴趣的:(编程,android,响应式)