相关系列文章
模块化解耦框架RxFluxArchitecture1-框架简介
模块化解耦框架RxFluxArchitecture2-基本功能实现
模块化解耦框架RxFluxArchitecture3-订阅管理绑定生命周期
模块化解耦框架RxFluxArchitecture4-依赖库与依赖注入
模块化解耦框架RxFluxArchitecture5-Application多模块共存
架构图
1、操作结果通知RxAction
和UI响应通知RxChange
1.1、View 调用
在LoginFragment
点击登录按钮,调用LoginActionCreator
中的方法login(String,String)
。
@OnClick(R2.id.btn_login)
public void login() {
mActionCreator.login(username, password);
}
1.2、ActionCreator 操作并发送
在LoginActionCreator
的方法login(String,String)
中postHttpAction(RxAction, Observable<T>)
方法会调用WanApi
接口方法进行登录操作,登录完成后发送封装接口返回结果的RxAction
(包含TagLoginAction.LOGIN
)。
@Override
public void login(String username, String password) {
RxAction rxAction = newRxAction(LoginAction.LOGIN);
postHttpAction(rxAction, mWanApi.login(username, password).flatMap(verifyResponse()));
}
1.3、Store 接收并发送
在LoginStore
中接收 Tag 为LoginAction.LOGIN
,数据类型为RxAction
的通知。取出RxAction
中封装的接口返回数据,然后使用方法postChange(RxChange)
通知 View 进行 UI 响应操作。
@Subscribe(tags = {LoginAction.LOGIN})
public void onLogin(RxAction rxAction) {
mUser = rxAction.getResponse();
postChange(RxChange.newInstance(rxAction.getTag()));
}
1.4、View 接收
在LoginActivity
中接收Tag为LoginAction.LOGIN
,数据类型为RxChange
的通知,进行 UI 更新操作。
@Subscribe(tags = {LoginAction.LOGIN}, sticky = true)
public void onLogin(RxChange rxChange) {
startActivity(new Intent(this, ArticleActivity.class));
finish();
}
2、操作进度通知RxLoading
2.1、ActionCreator 操作并发送
在LoginActionCreator
中使用postHttpLoadingAction(RxAction, Observable<T>)
方法。
操作开始时,发送进度开始通知RxLoading
;
操作完成,发送封装接口返回结果的RxAction
(包含TagLoginAction.LOGIN
);
操作结束后,发送进度结束通知RxLoading
。
@Override
public void login(String username, String password) {
RxAction rxAction = newRxAction(LOGIN);
postHttpLoadingAction(rxAction, mWanApi.login(username, password).flatMap(verifyResponse()));
}
2.2、View 接收
2.2.1、全局接收
在BaseActivity
中全局响应RxLoading
,所有子类 Activity 都会在接收到RxLoading
通知后,调用onRxLoading(RxLoading)
(方法名可变)。
@Subscribe(sticky = true)
public void onRxLoading(@NonNull RxLoading rxLoading) {
if (rxLoading.isLoading()) {
//显示进度框
} else {
//隐藏进度框
}
}
2.2.2、单独接收
在BaseActivity
子类LoginActivity
中重写onRxLoading(RxLoading)
方法,单独响应Tag为LoginAction.LOGIN
的RxLoading
。
@Override
@Subscribe(sticky = true)
public void onRxLoading(@NonNull RxLoading rxLoading) {
if (TextUtils.equals(rxLoading.getTag(), LoginAction.LOGIN)) {
if (rxLoading.isLoading()) {
//显示进度框
} else {
//隐藏进度框
}
} else {
super.onRxLoading(rxLoading);
}
}
3、 操作异常通知RxError
3.1、ActionCreator 操作并发送
在RxActionCretor
中postHttpAction(RxAction, Observable<T>)
和postHttpLoadingAction(RxAction, Observable<T>)
方法,如果有异常,会发送操作异常通知RxError
。
3.2、View 接收
3.2.1、全局接收
在BaseActivity
中全局响应RxError
,所有子类 Activity 都会在接收到RxError
通知后,调用onRxError(RxError)
(方法名可变)。
@Subscribe(sticky = true)
public void onRxError(@NonNull RxError rxError) {
Throwable throwable = rxError.getThrowable();
if (throwable instanceof CommonException) {
Toast.makeText(this, ((CommonException) throwable).message(), Toast.LENGTH_SHORT).show();
} else if (throwable instanceof retrofit2.HttpException) {
Toast.makeText(this, ((retrofit2.HttpException) throwable).code() + ":服务器问题", Toast.LENGTH_SHORT).show();
} else if (throwable instanceof SocketException) {
Toast.makeText(this, "网络异常!", Toast.LENGTH_SHORT).show();
} else if (throwable instanceof UnknownHostException) {
Toast.makeText(this, "网络异常!", Toast.LENGTH_SHORT).show();
} else if (throwable instanceof SocketTimeoutException) {
Toast.makeText(this, "连接超时!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, throwable.toString(), Toast.LENGTH_SHORT).show();
}
}
3.2.2、单独接收
在BaseActivity
子类LoginActivity
中重写onRxError(RxError)
方法,单独响应Tag为LoginAction.LOGIN
的RxError
。
@Override
@Subscribe(sticky = true)
public void onRxError(@NonNull RxError rxError) {
if (TextUtils.equals(rxError.getTag(), LoginAction.LOGIN)) {
//单独处理操作异常...
} else {
super.onRxError(rxError);
}
}
4、操作异常重试通知RxRtry
4.1、ActionCreator 操作并发送
在FriendActionCreator
中使用postHttpRetryAction(RxAction, Observable<T>)
方法,如果操作有异常,会发送异常重试通知RxRetry
。
@Override
public void getFriendList() {
RxAction rxAction = newRxAction(FriendAction.GET_FRIEND_LIST);
postHttpRetryAction(rxAction, mWanApi.getFriendList());
}
4.2、View 接收
4.2.1、全局接收
在BaseActivity
中全局响应RxRetry
,所有子类 Activity 都会在接收到RxRetry
通知后,调用onRxRetry(RxRetry)
(方法名可变)。在该方法中,可以使用RxActionCreator
中的postRetryAction(RxRetry)
方法重试。
@Subscribe(sticky = true)
public void onRxRetry(@NonNull RxRetry rxRetry) {
CoordinatorLayout coordinatorLayout = findViewById(R.id.cdl_content);
if (coordinatorLayout == null) {
return;
}
Snackbar snackbar = Snackbar.make(coordinatorLayout, rxRetry.getTag(), Snackbar.LENGTH_INDEFINITE);
snackbar.setAction("Retry", v -> mCommonActionCreatorLazy.get().postRetryAction(rxRetry)).show();
}
4.2.2、单独接收
在BaseActivity
子类中重写onRxRetry(RxRetry)
方法,单独响应特定 Tag 的RxRetry
。
@Override
@Subscribe(sticky = true)
public void onRxRetry (@NonNull RxRetry rxRetry) {
if (TextUtils.equals(rxRetry.getTag(), FriendAction.GET_FRIEND_LIST)) {
//单独处理异常重试...
} else {
super.onRxRetry(rxRetry);
}
}
源码
开源模块化解耦框架RxFluxArchitecture,欢迎大家点赞Fork,更欢迎点评指导。