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
}

免責聲明:一切學習資料都是從網上獲得,只是自己做了自己的總結和記錄

發佈了34 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章