1.MainActivity
protected void onDestroy() { super.onDestroy(); // 当Activity销毁的时候取消订阅时间,防止内存泄漏 if (subscribe != null) { if (subscribe.isUnsubscribed()) { subscribe.unsubscribe(); } } }}
this.orderName = orderName; } public List<Score> getScores() { return scores; } public void setScores(List<Score> scores) { this.scores = scores; }} 3.ApiService
package com.bwie.rxjavaonedemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import rx.Emitter;
import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action0;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* // 1.RxJava观察者模式
* // 2.链式调用
* // 3.非常灵活的线程调度,异步任务框架
* // 4.灵活的操作符
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "MainActivity";
// 被观察者创建的3种方式
private Button btnJust;
private Button btnFrom;
private Button btnCreate;
// 观察者创建的方式
private Button btnObserver;
private Button btnSubscribe;
private Button btnAction0;
private Button btnAction1;
private Button btnAction2;
// 线程调度
private Button btnSubscribeOn;
private Button btnObserveOn;
private Button btnReal;
// 操作符
private Button btnMap;
private Button btnFlatMap;
private Subscription subscribe;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 被观察者
btnJust = (Button) findViewById(R.id.btn_rx_just);
btnFrom = (Button) findViewById(R.id.btn_rx_from);
btnCreate = (Button) findViewById(R.id.btn_rx_create);
btnJust.setOnClickListener(this);
btnFrom.setOnClickListener(this);
btnCreate.setOnClickListener(this);
// 观察者
btnObserver = (Button) findViewById(R.id.btn_rx_observer);
btnSubscribe = (Button) findViewById(R.id.btn_rx_subscriber);
btnAction0 = (Button) findViewById(R.id.btn_rx_action0);
btnAction1 = (Button) findViewById(R.id.btn_rx_action1);
btnAction2 = (Button) findViewById(R.id.btn_rx_action2);
btnObserver.setOnClickListener(this);
btnSubscribe.setOnClickListener(this);
btnAction0.setOnClickListener(this);
btnAction1.setOnClickListener(this);
btnAction2.setOnClickListener(this);
// 线程调度
btnSubscribeOn = (Button) findViewById(R.id.btn_rx_subscribe_on);
btnObserveOn = (Button) findViewById(R.id.btn_rx_observe_on);
btnReal = (Button) findViewById(R.id.btn_rx_real);
btnSubscribeOn.setOnClickListener(this);
btnObserveOn.setOnClickListener(this);
btnReal.setOnClickListener(this);
// 操作符
btnMap = (Button) findViewById(R.id.btn_rx_map);
btnFlatMap = (Button) findViewById(R.id.btn_rx_flat_map);
btnMap.setOnClickListener(this);
btnFlatMap.setOnClickListener(this);
Log.i(TAG, "onCreate: " + Thread.currentThread().getName() + " id:"
+ Thread.currentThread().getId());
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_rx_just:
// 被观察者创建方式1
Observable observable1 = Observable.just(1, 2, 3, 4);
break;
case R.id.btn_rx_from:
// 被观察者创建方式2
String[] strs = {"hello", "world", "android"};
Observable observable2 = Observable.from(strs);
break;
case R.id.btn_rx_create:
// 被观察者第3种创建方式
Observable<String> observable3 = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("world");
subscriber.onNext("android");
subscriber.onNext("java");
subscriber.onCompleted();
}
});
//
// observable3.subscribeOn(AndroidSchedulers.mainThread())
// .observeOn(Schedulers.io())
// .subscribe(new Observer() {
// @Override
// public void onCompleted() {
//
// }
//
// @Override
// public void onError(Throwable e) {
//
// }
//
// @Override
// public void onNext(Object o) {
// Log.i(TAG, "onNext: " + o);
// }
// });
break;
case R.id.btn_rx_observer:
Observable<Integer> observable4 = Observable.just(1, 2, 3, 4);
// 第一种观察者创建方式
Observer observer1 = new Observer<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
Log.i(TAG, "onNext: " + integer);
}
};
// 语法上是被观察者订阅观察者,实际上是观察者订阅被观察者,为了方便语法上的链式调用
observable4.subscribe(observer1);
break;
case R.id.btn_rx_subscriber:
Observable<Integer> observable5 = Observable.just(1, 2, 3, 4);
// 第二种观察者创建方式
Subscriber<Integer> subscriber = new Subscriber<Integer>() {
@Override
public void onStart() {
super.onStart();
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
Log.i(TAG, "onNext: " + integer);
}
};
observable5.subscribe(subscriber);
break;
case R.id.btn_rx_action0:
Observable<Integer> observable6 = Observable.just(1, 2, 3, 4);
// 观察者第三种创建方式
Action1<Integer> action1 = new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.i(TAG, "call: " + integer);
}
};
observable6.subscribe(action1);
break;
// 闭包
case R.id.btn_rx_action1:
Observable<Integer> observable7 = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onNext(3);
subscriber.onNext(4);
subscriber.onError(new Throwable("这是一条错误信息"));
}
});
Action1<Integer> action11 = new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.i(TAG, "call: " + integer);
}
};
Action1<Throwable> action12 = new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.e(TAG, "call: " + throwable.getMessage());
}
};
observable7.subscribe(action11, action12);
break;
case R.id.btn_rx_action2:
Observable<Integer> observable8 = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onNext(3);
subscriber.onNext(4);
// onCompleted和onError只能执行一个
subscriber.onCompleted();
// subscriber.onError(new Throwable("这是一条错误信息"));
}
});
Action1<Integer> action21 = new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.i(TAG, "call: " + integer);
}
};
Action1<Throwable> action22 = new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Log.e(TAG, "call: " + throwable.getMessage());
}
};
Action0 action20 = new Action0() {
@Override
public void call() {
Log.i(TAG, "call: onComplete");
}
};
observable8.subscribe(action21, action22, action20);
break;
case R.id.btn_rx_subscribe_on:
Log.i(TAG, "click thread name: " + Thread.currentThread().getName());
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
Log.i(TAG, "create call: " + Thread.currentThread().getName());
Log.i(TAG, "create call: " + Thread.currentThread().getId());
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onNext(3);
subscriber.onNext(4);
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.io())
.map(new Func1<Integer, String>() {
@Override
public String call(Integer integer) {
Log.i(TAG, "map call: " + Thread.currentThread().getName());
Log.i(TAG, "map call: " + Thread.currentThread().getId());
return String.valueOf(integer);
}
})
.subscribeOn(Schedulers.newThread())
// .subscribeOn(Schedulers.io())
// .subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String integer) {
Log.i(TAG, "subscribe thread name: " + Thread.currentThread().getName());
Log.i(TAG, "subscribe thread id: " + Thread.currentThread().getId());
Log.i(TAG, "call: " + integer);
}
});
break;
case R.id.btn_rx_observe_on:
Log.i(TAG, "click thread name: " + Thread.currentThread().getName());
Observable
.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
Log.i(TAG, "create call: " + Thread.currentThread().getName());
Log.i(TAG, "create call: " + Thread.currentThread().getId());
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onNext(3);
subscriber.onNext(4);
subscriber.onCompleted();
}
})
// .subscribeOn(Schedulers.io())
// .observeOn(Schedulers.newThread())
// 执行subscribeOn所有之前的操作所在的线程,只生效一次
.subscribeOn(Schedulers.newThread())
// observeOn每做一次就执行一次线程切换,下一个操作符的线程
.observeOn(Schedulers.io())
.map(new Func1<Integer, String>() {
@Override
public String call(Integer integer) {
Log.i(TAG, "map call: " + Thread.currentThread().getName());
Log.i(TAG, "map call: " + Thread.currentThread().getId());
return String.valueOf(integer);
}
})
.observeOn(AndroidSchedulers.mainThread())
// .subscribeOn(Schedulers.io())
// .subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<String>() {
@Override
public void call(String integer) {
Log.i(TAG, "subscribe thread name: " + Thread.currentThread().getName());
Log.i(TAG, "subscribe thread id: " + Thread.currentThread().getId());
Log.i(TAG, "call: " + integer);
}
});
break;
case R.id.btn_rx_real:
subscribe = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(2);
subscriber.onNext(4);
subscriber.onNext(5);
subscriber.onNext(6);
subscriber.onCompleted();
}
})
.delay(3, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.i(TAG, "call: " + integer);
}
});
break;
case R.id.btn_rx_map:
Observable.just(1, 2, 3, 4)
// 变换操作
.map(new Func1<Integer, Student>() {
@Override
public Student call(Integer integer) {
Student stu = new Student();
stu.setId(integer);
stu.setOrderName("序号为" + integer);
return stu;
// return "这是第" + integer + "个数据";
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Student>() {
@Override
public void call(Student stu) {
Log.i(TAG, "call: id is" + stu.getId());
Log.i(TAG, "call: ordername is" + stu.getOrderName());
}
});
break;
case R.id.btn_rx_flat_map:
// List<>
List<Student> stus = initData();
Observable.from(stus)
// 平铺
.flatMap(new Func1<Student, Observable<Score>>() {
@Override
public Observable<Score> call(Student student) {
List<Score> scores = student.getScores();
return Observable.from(scores);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Score>() {
@Override
public void call(Score score) {
Log.i(TAG, "call: " + score.getThoeryScore());
}
});
break;
}
}
private List<Student> initData() {
List<Student> stus = new ArrayList<>();
List<Score> scores1 = new ArrayList<>();
Score score1 = new Score(10, 20);
Score score2 = new Score(20, 30);
Score score3 = new Score(30, 40);
scores1.add(score1);
scores1.add(score2);
scores1.add(score3);
stus.add(new Student(1, "a1", scores1));
List<Score> scores2 = new ArrayList<>();
Score score21 = new Score(30, 10);
Score score22 = new Score(40, 30);
Score score23 = new Score(30, 40);
scores2.add(score21);
scores2.add(score22);
scores2.add(score23);
stus.add(new Student(2, "a2", scores2));
List<Score> scores3 = new ArrayList<>();
Score score31 = new Score(40, 20);
Score score32 = new Score(0, 30);
Score score33 = new Score(30, 90);
scores3.add(score31);
scores3.add(score32);
scores3.add(score33);
stus.add(new Student(3, "a3", scores3));
return stus;
}
@Overridepackage com.bwie.rxjavaonedemo;
import java.util.List;
/**
* Created by WuXirui
* Create Time: 2017/12/4
* Description:
*/
public class Student {
private int id;
private String orderName;
private List<Score> scores;
public Student() {
}
public Student(int id, String orderName, List<Score> scores) {
this.id = id;
this.orderName = orderName;
this.scores = scores;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public List<Score> getScores() {
return scores;
}
public void setScores(List<Score> scores) {
this.scores = scores;
}
}
protected void onDestroy() { super.onDestroy(); // 当Activity销毁的时候取消订阅时间,防止内存泄漏 if (subscribe != null) { if (subscribe.isUnsubscribed()) { subscribe.unsubscribe(); } } }}
2.Student
package com.bwie.rxjavaonedemo;
import java.util.List;
/**
* Created by WuXirui
* Create Time: 2017/12/4
* Description:
*/
public class Student {
private int id;
private String orderName;
private List<Score> scores;
public Student() {
}
public Student(int id, String orderName, List<Score> scores) {
this.id = id;
this.orderName = orderName;
this.scores = scores;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {package com.bwie.rxjavaonedemo;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
import rx.Observable;
/**
* Created by WuXirui
* Create Time: 2017/12/5
* Description:
*/
public interface ApiService {
@GET("product/getCatagory")
Observable<MessageBean<List<Category>>> getCatagory();
}
this.orderName = orderName; } public List<Score> getScores() { return scores; } public void setScores(List<Score> scores) { this.scores = scores; }} 3.ApiService
package com.bwie.rxjavaonedemo;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
import rx.Observable;
/**
* Created by WuXirui
* Create Time: 2017/12/5
* Description:
*/
public interface ApiService {
@GET("product/getCatagory")
Observable<MessageBean<List<Category>>> getCatagory();
}
4.Score
package com.bwie.rxjavaonedemo;
/**
* Created by WuXirui
* Create Time: 2017/12/4
* Description:
*/
public class Score {
private int thoeryScore;
private int scaleScore;
public Score() {
}
public Score(int thoeryScore, int scaleScore) {
this.thoeryScore = thoeryScore;
this.scaleScore = scaleScore;
}
public int getThoeryScore() {
return thoeryScore;
}
public void setThoeryScore(int thoeryScore) {
this.thoeryScore = thoeryScore;
}
public int getScaleScore() {
return scaleScore;
}
public void setScaleScore(int scaleScore) {
this.scaleScore = scaleScore;
}
}