Skip to content

Commit 0d8a692

Browse files
author
Yaoda Wang
committed
Add subject as middle man to receive events. Still need to reconsider replays
1 parent b894672 commit 0d8a692

File tree

8 files changed

+132
-70
lines changed

8 files changed

+132
-70
lines changed

app/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,7 @@ dependencies {
3636
compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
3737
compile 'com.jakewharton:butterknife:8.5.1'
3838
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
39+
compile 'com.jakewharton.rx:replaying-share:2.0.0'
40+
3941

4042
}

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<uses-permission android:name="android.permission.READ_CONTACTS"/>
99

1010
<application
11+
android:name=".MainApplication"
1112
android:allowBackup="true"
1213
android:icon="@mipmap/ic_launcher"
1314
android:label="@string/app_name"

app/src/main/java/io/phoenix/demo/rxauthdemo/AuthManager.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import android.text.TextUtils;
44

5+
import java.util.concurrent.TimeUnit;
6+
57
import io.phoenix.demo.rxauthdemo.action.AuthAction.SignUpAction;
68
import io.phoenix.demo.rxauthdemo.result.AuthResult;
79
import io.reactivex.Observable;
@@ -14,25 +16,24 @@
1416
*/
1517

1618
public class AuthManager {
17-
public Observable<AuthResult.SignUpResult> signUp(SignUpAction action) {
19+
private static final String TAG = "AuthManager";
20+
private SignUpResult result;
21+
private Observable<SignUpResult> observable = Observable.fromCallable(() -> result)
22+
.delay(5000, TimeUnit.MILLISECONDS);
1823

24+
public Observable<AuthResult.SignUpResult> signUp(SignUpAction action) {
25+
//检查用户名是否合法
1926
if (TextUtils.isEmpty(action.getUsername()) || !action.getUsername().contains("@")) {
20-
return Observable.fromCallable(() -> {
21-
Thread.sleep(1000);
22-
return SignUpResult.FAIL_USERNAME;
23-
});
27+
result = SignUpResult.FAIL_USERNAME;
2428
}
29+
//检查密码合法
2530
if (TextUtils.isEmpty(action.getPassword()) || action.getPassword().length() < 9) {
26-
return Observable.fromCallable(() -> {
27-
Thread.sleep(1000);
28-
return SignUpResult.FAIL_PASSWORD;
29-
});
31+
result = SignUpResult.FAIL_PASSWORD;
32+
} else {
33+
//检查结束,返回注册成功的信息
34+
// TODO: createUser
35+
result = SignUpResult.SUCCESS;
3036
}
31-
// TODO: createUser
32-
return Observable.fromCallable(() -> {
33-
Thread.sleep(1000);
34-
return SignUpResult.SUCCESS;
35-
});
37+
return observable;
3638
}
37-
38-
}
39+
}

app/src/main/java/io/phoenix/demo/rxauthdemo/AuthUiModel.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ public class AuthUiModel {
99
private final boolean usrValidate;
1010
private final boolean pwdValidate;
1111
private final boolean success;
12-
1312
private final String errorMessage;
1413

1514
private AuthUiModel(boolean inProcess, boolean usrValidate, boolean pwdValidate, boolean success, String errorMessage) {
@@ -18,8 +17,6 @@ private AuthUiModel(boolean inProcess, boolean usrValidate, boolean pwdValidate,
1817
this.pwdValidate = pwdValidate;
1918
this.success = success;
2019
this.errorMessage = errorMessage;
21-
22-
2320
}
2421

2522
public static AuthUiModel idle() {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.phoenix.demo.rxauthdemo;
2+
3+
import android.app.Application;
4+
5+
import io.phoenix.demo.rxauthdemo.translator.AuthTranslator;
6+
7+
/**
8+
* Created by yaoda on 24/04/17.
9+
*/
10+
11+
public class MainApplication extends Application {
12+
13+
private AuthTranslator translator;
14+
15+
@Override
16+
public void onCreate() {
17+
super.onCreate();
18+
translator = new AuthTranslator(new AuthManager());
19+
}
20+
21+
public AuthTranslator getTranslator() {
22+
return translator;
23+
}
24+
}

app/src/main/java/io/phoenix/demo/rxauthdemo/RxLoginActivity.java

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414

1515
import butterknife.BindView;
1616
import butterknife.ButterKnife;
17-
import io.phoenix.demo.rxauthdemo.event.AuthEvent;
1817
import io.phoenix.demo.rxauthdemo.event.AuthEvent.SignUpEvent;
1918
import io.phoenix.demo.rxauthdemo.translator.AuthTranslator;
19+
import io.reactivex.Observable;
2020
import io.reactivex.android.schedulers.AndroidSchedulers;
2121
import io.reactivex.disposables.CompositeDisposable;
22+
import io.reactivex.disposables.Disposable;
23+
import io.reactivex.schedulers.Schedulers;
2224

2325
/**
2426
* Created by awang on 2017/4/23.
@@ -33,47 +35,65 @@ public class RxLoginActivity extends AppCompatActivity {
3335
View mProgressView;
3436
@BindView(R.id.email_sign_in_button)
3537
Button mEmailSignInButton;
38+
@BindView(R.id.button_test)
39+
Button button;
3640
private CompositeDisposable disposables;
3741
private AuthTranslator translator;
42+
private Observable<String> stringObservable;
3843

3944
@Override
4045
protected void onCreate(@Nullable Bundle savedInstanceState) {
4146
super.onCreate(savedInstanceState);
4247
setContentView(R.layout.activity_login);
43-
translator = new AuthTranslator(new AuthManager());
48+
translator = ((MainApplication) getApplication()).getTranslator();
4449
ButterKnife.bind(this);
4550
disposables = new CompositeDisposable();
4651
}
4752

4853
@Override
4954
protected void onStart() {
5055
super.onStart();
51-
disposables.add(RxView.clicks(mEmailSignInButton)
52-
.map(ignore -> new SignUpEvent(mEmailView.getText().toString(), mPasswordView.getText().toString()))
53-
.compose(translator.signUp)
54-
.observeOn(AndroidSchedulers.mainThread())
55-
.subscribe(authUiModel -> {
56-
Log.d("", "onStart:received " );
57-
if(authUiModel.isInProcess()){
58-
Log.d("", "onStart: in progress " + System.currentTimeMillis());
59-
}
60-
mProgressView.setVisibility(authUiModel.isInProcess() ? View.VISIBLE : View.GONE);
61-
if (!authUiModel.isPwdValidate()) {
62-
mPasswordView.setError(authUiModel.getErrorMessage());
63-
} else {
64-
mPasswordView.setError(null);
65-
}
66-
if (!authUiModel.isUsrValidate()) {
67-
mEmailView.setError(authUiModel.getErrorMessage());
68-
} else {
69-
mEmailView.setError(null);
70-
}
71-
if(authUiModel.isSuccess()){
72-
Log.d("", "onStart: in success " + System.currentTimeMillis());
73-
Toast.makeText(this, "CreateUser SuccessFull", Toast.LENGTH_SHORT)
74-
.show();
75-
}
76-
}));
56+
/* RxView.clicks(mEmailSignInButton).subscribe(ignore -> {
57+
stringObservable = Observable.fromCallable(() -> {
58+
System.out.println("started");
59+
Thread.sleep(1000);
60+
return "1";
61+
}).subscribeOn(Schedulers.io()).doOnDispose(()-> System.out.println("ended")).replay(1).autoConnect();
62+
Disposable subscribe = stringObservable.subscribe(System.out::println);
63+
Thread.sleep(200);
64+
subscribe.dispose();
65+
});
66+
RxView.clicks(button).subscribe(ignore -> {
67+
stringObservable.subscribe(System.out::println);
68+
});*/
69+
70+
Observable<SignUpEvent> click = RxView.clicks(mEmailSignInButton)
71+
.map(ignore -> new SignUpEvent(mEmailView.getText()
72+
.toString(), mPasswordView.getText().toString()));
73+
disposables.add(click.compose(translator.signUp)
74+
.observeOn(AndroidSchedulers.mainThread())
75+
.subscribe(authUiModel -> {
76+
Log.d("", "received: " + Thread.currentThread().getName());
77+
78+
if (authUiModel.isInProcess()) {
79+
Log.d("", "onStart: in progress " + System.currentTimeMillis());
80+
}
81+
mProgressView.setVisibility(authUiModel.isInProcess() ? View.VISIBLE : View.GONE);
82+
if (!authUiModel.isPwdValidate()) {
83+
mPasswordView.setError(authUiModel.getErrorMessage());
84+
} else {
85+
mPasswordView.setError(null);
86+
}
87+
if (!authUiModel.isUsrValidate()) {
88+
mEmailView.setError(authUiModel.getErrorMessage());
89+
} else {
90+
mEmailView.setError(null);
91+
}
92+
if (authUiModel.isSuccess()) {
93+
Log.d("", "onStart: in success " + System.currentTimeMillis());
94+
Toast.makeText(this, "CreateUser SuccessFull", Toast.LENGTH_SHORT).show();
95+
}
96+
}));
7797
}
7898

7999
@Override

app/src/main/java/io/phoenix/demo/rxauthdemo/translator/AuthTranslator.java

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import io.phoenix.demo.rxauthdemo.action.AuthAction.SignUpAction;
77
import io.phoenix.demo.rxauthdemo.event.AuthEvent.SignUpEvent;
88
import io.phoenix.demo.rxauthdemo.result.AuthResult.SignUpResult;
9+
import io.reactivex.Observable;
910
import io.reactivex.ObservableTransformer;
10-
import io.reactivex.schedulers.Schedulers;
11+
import io.reactivex.subjects.BehaviorSubject;
12+
import io.reactivex.subjects.Subject;
1113

1214

1315
/**
@@ -16,31 +18,38 @@
1618

1719
public class AuthTranslator {
1820
private AuthManager authManager;
21+
private Subject<SignUpEvent> middle = BehaviorSubject.create();
22+
private Observable<AuthUiModel> authUiModelObservable
23+
= middle.map(event -> new SignUpAction(event.getUsername(), event.getPassword()))
24+
//使用FlatMap转向,进行注册
25+
.flatMap(action -> authManager.signUp(action)
26+
//扫描结果
27+
.map(signUpResult -> {
28+
if (signUpResult == SignUpResult.FAIL_USERNAME) {
29+
return AuthUiModel.fail(false, true, "Username error");
30+
}
31+
if (signUpResult == SignUpResult.FAIL_PASSWORD) {
32+
return AuthUiModel.fail(true, false, "Password error");
33+
}
34+
if (signUpResult == SignUpResult.SUCCESS) {
35+
return AuthUiModel.success();
36+
}
37+
//TODO Handle error
38+
throw new IllegalArgumentException("Unknown Result");
39+
}).replay(1).autoConnect()
40+
//设置初始状态为loading。
41+
.startWith(AuthUiModel.inProcess())
42+
//设置错误状态为error,防止触发onError() 造成断流
43+
.onErrorReturn(error -> AuthUiModel.fail(true, true, error.getMessage())));
44+
;
1945
public final ObservableTransformer<SignUpEvent, AuthUiModel> signUp
20-
= observable -> observable.map(event -> new SignUpAction(event.getUsername(), event.getPassword()))
21-
.flatMap(action -> authManager.signUp(action)
22-
.subscribeOn(Schedulers.io())
23-
.map(signUpResult -> {
24-
if (signUpResult == SignUpResult.FAIL_USERNAME) {
25-
return AuthUiModel.fail(false, true, "Username error");
26-
}
27-
if (signUpResult == SignUpResult.FAIL_PASSWORD) {
28-
return AuthUiModel.fail(true, false, "Password error");
29-
}
30-
if (signUpResult == SignUpResult.SUCCESS) {
31-
return AuthUiModel.success();
32-
}
33-
//TODO Handle error
34-
throw new IllegalArgumentException("Unknown Result");
35-
})
36-
.startWith(AuthUiModel.inProcess())
37-
.onErrorReturn(error -> AuthUiModel
38-
.fail(true, true, error.getMessage())));
39-
46+
//上游是UiEvent,封装成对应的Action
47+
= observable -> {
48+
observable.subscribe(middle);
49+
return authUiModelObservable;
50+
};
4051

4152
public AuthTranslator(AuthManager authManager) {
4253
this.authManager = authManager;
4354
}
44-
45-
4655
}

app/src/main/res/layout/activity_login.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,14 @@
6969
android:textStyle="bold"/>
7070

7171

72+
<Button
73+
android:id="@+id/button_test"
74+
android:layout_width="match_parent"
75+
android:layout_height="wrap_content"
76+
android:layout_marginTop="16dp"
77+
android:text="@string/action_sign_in"
78+
android:textStyle="bold"/>
79+
7280

7381
<!--<ProgressBar-->
7482
<!--android:layout_gravity="center"-->

0 commit comments

Comments
 (0)