public class LoginActivity extends BaseActivity implements LoginView {
Handler handler = new Handler();
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
@Override
protected void initDatas() {
/**
* 1、初始的RxJava
*/
// rxJavaDemo();
/**
* 2、簡潔版的RxJava
*/
// rxJavaDemo_concise();
/**
* 3、用操作符來進行操作Rxjava
*/
// rxJavaDemo_operator();
/**
* 4、深的操作符號(*****)
*/
// rxJavaDemo_operator_more();
/**
* 5、更深的操作符號(主要是講 onComplete()和onError() )
* 這兩個函數用來通知訂閱者,被觀察的對象將停止發送數據以及為什么停止(成功的完成或者出錯了)。
*
* 還有RxJava 線程調度的問題
*/
// rxJavaDemo_operator_more_more();
/***
* Rxjava 在Android 中應用
*/
rxJavaDemo_operator_more_more_android();
}
/**
* 接著要介紹的就是AndroidObservable,它提供了跟多的功能來配合Android的生命周期。
* bindActivity()和bindFragment()方法默認使用AndroidSchedulers.mainThread()來執行觀察者代碼,這兩個方法會在Activity或者Fragment結束的時候通知被觀察者停止發出新的消息。
*/
private void rxJavaDemo_operator_more_more_android() {
}
private void rxJavaDemo_operator_more_more() {
Subscription a = Observable.just("這個在的線程是:").subscribeOn(Schedulers.io())//訂閱者發生在 工作線程中 即io
.observeOn(AndroidSchedulers.mainThread())//發生在主線程中 即 觀察者 在 main線程中
.subscribe(s -> showMessagers(s));
//停止當前的操作 RxJava的另外一個好處就是它處理unsubscribing的時候,會停止整個調用鏈。
// 如果你使用了一串很復雜的操作符,調用unsubscribe將會在他當前執行的地方終止。不需要做任何額外的工作!
// a.unsubscribe();
new View(this).postDelayed(() -> a.unsubscribe(), 2000);
}
/**
* 相比更加詳細的操作符學習
*/
private void rxJavaDemo_operator_more() {
// Observable.from()方法,它接收一個集合作為輸入,然后每次輸出一個元素給subscriber:
// ArrayList<String> list = new ArrayList<>();
//
// list.add("d");
// list.add("ddddd");
// String[] arrays = {"d", "b"};
// Observable.from(list).subscribe(s -> showMessagers(s));
//將list數據給觀察者 這個為比較復雜的寫法了
getDbDatas().subscribe(listData -> {
Observable.from(listData).subscribe(listSring -> showMessagers(listSring));
});
/**
* 這個是用flatmap寫的 相對來說要簡單很多
*/
getDbDatas().flatMap(new Func1<List<String>, Observable<String>>() {
@Override
public Observable<String> call(List<String> strings) {
return Observable.from(strings);
}
}).subscribe(s -> showMessagers(s));
/**
* 用蘭博啦來寫就更簡單了
*/
getDbDatas().flatMap(listData -> Observable.from(listData)).subscribe(listString -> showMessagers(listString));
/**
* 接著前面的例子,現在我不想打印URL了,而是要打印收到的每個網站的標題。
* 問題來了,我的方法每次只能傳入一個URL,并且返回值不是一個String,
* 而是一個輸出String的Observabl對象。使用flatMap()可以簡單的解決這個問題。
*/
getDbDatas().flatMap(stringList -> Observable.from(stringList)).flatMap(stringData -> getTitle(stringData)).subscribe(title -> showMessagers(title));
/**
* filter()輸出和輸入相同的元素,并且會過濾掉那些不滿足檢查條件的。
* take()如果我們只想要最多5個結果:
* doOnNext()允許我們在每次輸出一個元素之前做一些額外的事情,比如這里的保存標題。
*/
getDbDatas().flatMap(stringList -> Observable.from(stringList)).flatMap(stringData -> getTitle(stringData)).filter(title -> title != null).take(5).doOnNext(title -> saveTitle(title)).subscribe(title -> showMessagers(title));
}
/**
* 保存標題等操作
*/
public void saveTitle(String t) {
}
/**
* 根據 string 串來進行查詢Title
*/
Observable<String> getTitle(String URL) {
String data = "data";
return Observable.just(data);
}
/**
* 返回Observable<String>數據
*
* @return
*/
public Observable<String> getStringData() {
return Observable.just("數據");
}
/**
* 得到Observable<List<String>>對象
*
* @return
*/
public Observable<List<String>> getDbDatas() {
List listData = new ArrayList();
listData.add("a");
listData.add("b");
listData.add("c");
listData.add("d");
return Observable.just(listData);
}
/**
* 用RxJava中操作符來進行操作 map就是來進行對observable改變的 map()操作符就是用于變換Observable對象的
*/
private void rxJavaDemo_operator() {
Observable.just("這個是操作符的操作哦").map(s -> s + "demo").subscribe(s -> showMessagers(s));
Observable.just("操作符號哦222222").map(s -> s.hashCode()).subscribe(s -> showMessagers(s.toString()));//中間對 observable 進行改變 變成hash 值
Observable.just("操作符號哦3333復雜的").map(s -> s.hashCode()).map(i -> Integer.toString(i)).subscribe(s -> showMessagers(s));//連續兩個map進行轉接
}
/**
* 簡潔版本的 RxJava
*/
private void rxJavaDemo_concise() {
/**
* 比如Observable.just就是用來創建只發出一個事件就結束的Observable對象,上面創建Observable對象的代碼可以簡化為一行
*/
Observable<String> myObservable = Observable.just("這個是只發出一個事件的-->這個是RxJava");
/**
* 接下來看看如何簡化Subscriber,上面的例子中,我們其實并不關心OnComplete和OnError,我們只需要在onNext的時候做一些處理,這時候就可以使用Action1類。
*/
Action1<String> onNextAction = new Action1<String>() {
@Override
public void call(String s) {
//相當于Subscriber中的接受
Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show();
}
};
myObservable.subscribe(onNextAction);
//其實上面的完全可以寫成這樣的哦
Observable.just("結合到一起的寫法").subscribe(new Action1<String>() {
@Override
public void call(String s) {
Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show();
}
});
//或者用lambda表達式的寫法 這個就更簡單了哦~~~~
Observable.just("lambda表達式的寫法 看看星星").subscribe(s -> Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show());
}
/**
* Observable 被觀察者 Subscribers 觀察者
*/
private void rxJavaDemo() {
/**
* 創建觀察者模式 --> 被觀察者
*
* 一個Observable可以發出零個或者多個事件,知道結束或者出錯。
* 每發出一個事件,就會調用它的Subscriber的onNext方法,最后調用Subscriber.onNext()或者Subscriber.onError()結束。
*/
Observable<String> myObservable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("這是RxJava");
subscriber.onCompleted();
}
});
/**
* 接著我們創建一個Subscriber來處理Observable對象發出的字符串。
*
*/
Subscriber<String> mySubscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
Toast.makeText(LoginActivity.this, "完成啦...", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Toast.makeText(LoginActivity.this, s, Toast.LENGTH_SHORT).show();
}
};
/**
* 這里subscriber僅僅就是打印observable發出的字符串。
* 通過subscribe函數就可以將我們定義的myObservable對象和mySubscriber對象關聯起來,這樣就完成了subscriber對observable的訂閱。
*/
myObservable.subscribe(mySubscriber);
}
@Override
protected void initListeners() {
}
@Override
protected void initViews(Bundle savedInstanceState) {
}
@Override
public void showMessagers(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}