一:什麼是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
}
免責聲明:一切學習資料都是從網上獲得,只是自己做了自己的總結和記錄