因为在iOS中使用RAC、RxSwift,感受到它的好处,比如Btn点击直接传值,不用弯弯绕绕的;数据绑定,自动更新。
所以安卓中也用起来。
引入依赖:
compile 'io.reactivex.rxjava2:rxjava:2.1.3'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1’
在LoginVM中实现函数login,返回一个被观察对象LoginResultModel(其中保存数据就在此中VM中进行了,MVVM数据处理一般在VM中)。
public Observable<LoginResultModel> login(final RequestBody paras) {
return Observable.create(new ObservableOnSubscribe<LoginResultModel>() {
@Override
//subscribe手动加上final,以便在post内部使用。
public void subscribe(final @NonNull ObservableEmitter<LoginResultModel> e) throws Exception {
LFNetWorking lf = new LFNetWorking();
lf.post(paras, API.User_Login, new LFCallBack() {
@Override
public void successCallBack(String json) {
LoginResultModel model = JsonUtil.paraseJson(json, LoginResultModel.class);
e.onNext(model);
e.onComplete();
}
@Override
public void failueCallBack(Throwable error) {
e.onError(error);
e.onComplete();
}
});
}
});
}
在Activity中使用
private void loginBtnAction() {
final EditText account = (EditText) findViewById(R.id.account);
final EditText password = (EditText) findViewById(R.id.password);
String ac = account.getText().toString();
String pwd = password.getText().toString();
RequestBody paras = new FormBody.Builder()
.add("UserName", ac)
.add("Password", pwd)
.add("DeviceId", "123")
.build();
loginVM.login(paras)
.subscribe(new Consumer<LoginResultModel>() {
@Override
public void accept(LoginResultModel s) throws Exception {
Log.i("007:", "accept: " + s.getUser().getFullName().toString());
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
//对应onError,必须写出来,否则onError的时候会崩溃。
Log.i("007:", "acceptError: " + throwable.getMessage().toString());
}
}, new Action() {
@Override
public void run() throws Exception {
//对应onComplete。
}
});
}