使用Rxjava实现注册登录你真的会了吗

作为一名android开发者不得不说Rxjava真的很强大,强大的同时Rxjava的复杂也是让大家头疼。

自己写了一个注册登录的例子,通过这个例子我们需要知道Rxjava基本的使用方法,flatmap,do(doOnNext..),error(onErrorReturn..)等操作符的使用。

直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//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给去除掉