使用Rxjava
實現註冊登入你真的會了嗎
作為一名
android
開發者不得不說Rxjava
真的很強大,強大的同時Rxjava
的複雜也是讓大家頭疼。自己寫了一個註冊登入的例子,通過這個例子我們需要知道
Rxjava
基本的使用方法,flatmap
,do
(doOnNext
..),error
(onErrorReturn
..)等操作符的使用。
直接上程式碼
//reg() login() 登入註冊介面
reg().subscribeOn(Schedulers.io())//子執行緒中註冊
.observeOn(AndroidSchedulers.mainThread())//主執行緒中處理註冊結果
.doOnSubscribe(new Consumer<Disposable>() {//發起訂閱時回撥,可以彈出載入窗等操作
@Override
public void accept(Disposable disposable) throws Exception {
Log.e(TAG, Thread.currentThread().getName() + " doOnSubscribe: ");
loadDialog = ProgressDialog.
show(Day6Activity.this, "正在載入", "正在載入請耐心等待");
}
})
.doOnNext(new Consumer<RegResponBean>() {//doOnNext(在onNext之前回撥)
@Override
public void accept(RegResponBean regResponBean) throws Exception {
Log.e(TAG, Thread.currentThread().getName() + " doOnNext: ");
if (regResponBean.isError()) {//拿出結果提示註冊是否成功
Toast.makeText(Day6Activity.this, "註冊失敗", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(Day6Activity.this, "註冊成功", Toast.LENGTH_SHORT).show();
}
}
})
//onErrorReturn() 遇到異常可以捕獲到異常(異常被我們處理了不會走onError()
//並且可以在這裡提示註冊失敗,定義失敗的引數傳送出去
.onErrorReturn(new Function<Throwable, RegResponBean>() {
@Override
public RegResponBean apply(Throwable throwable) throws Exception {
Log.e(TAG, Thread.currentThread().getName() + " onErrorReturn: ");
Toast.makeText(Day6Activity.this, "請求註冊介面失敗", Toast.LENGTH_SHORT).show();
RegResponBean regResponBean = new RegResponBean();
regResponBean.setError(true);
return regResponBean;
}
})
.observeOn(Schedulers.io())//註冊完成後進行登入,所以切換到子執行緒請求登入
//把註冊的結果轉化為登入請求
.flatMap(new Function<RegResponBean, ObservableSource<?>>() {
@Override
public ObservableSource<?> apply(RegResponBean regResponBean) throws Exception {
Log.e(TAG, Thread.currentThread().getName() + " flatMap: ");
//當註冊介面的返回值提示失敗
//當請求註冊介面失敗來自onErrorReturn()
if (regResponBean.isError()) {
//Observable.empty()相當於傳送onComplete事件
return Observable.empty();
} else {
return login();//註冊成功,返回登入介面發起登入事件
}
}
})
.observeOn(AndroidSchedulers.mainThread())//主執行緒中處理登入結果
.doFinally(new Action() {//結束請求
@Override
public void run() throws Exception {
loadDialog.dismiss();
Log.e(TAG, Thread.currentThread().getName() + " doFinally: ");
}
})
.subscribe(new Consumer<Object>() {//登入成功
@Override
public void accept(Object o) throws Exception {
Log.e(TAG, Thread.currentThread().getName() + " onNext: ");
Toast.makeText(Day6Activity.this, "登入成功", Toast.LENGTH_SHORT).show();
}
}, new Consumer<Throwable>() {//登入失敗
@Override
public void accept(Throwable throwable) throws Exception {
Log.e(TAG, Thread.currentThread().getName() + " onError: ");
Toast.makeText(Day6Activity.this, "請求登入介面失敗",
Toast.LENGTH_SHORT).show();
}
});
複製程式碼
tips:如果不需要判斷是那個介面請求失敗可以把onErrorReturn
給去除掉