模块化解耦框架RxFluxArchitecture2-基本功能实现

886 阅读3分钟

相关系列文章

模块化解耦框架RxFluxArchitecture1-框架简介

模块化解耦框架RxFluxArchitecture2-基本功能实现

模块化解耦框架RxFluxArchitecture3-订阅管理绑定生命周期

模块化解耦框架RxFluxArchitecture4-依赖库与依赖注入

模块化解耦框架RxFluxArchitecture5-Application多模块共存

架构图

架构图.jpg

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.LOGINRxLoading

    @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 操作并发送

RxActionCretorpostHttpAction(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.LOGINRxError

    @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,更欢迎点评指导。