Rexxar Android 系列学习(4) 错误处理

EventBus

首先介绍一下 EventBus ,具体可以查看之前总结的 SimpleNews 项目的重构之旅(3) -EventBus 接入 因为 Rexxar 错误处理使用到了 EventBus,其实用过的同学一看就懂了,这里使用的是 EventBus 最基本的用法。

这里使用的是 2.4,目前都是 3.0,不过用法基本一样。

RxLoadError

其实这部分很小,本来不打算总结,不过觉得使用起来还是很整洁的,很统一,扩展起来也比较方便,所以拿来分享下,之后也会采用这种方式书写。

先看下代码:

public enum RxLoadError {
ROUTE_NOT_FOUND(0, "无法找到合适的Route"), // route找不到
HTML_NO_CACHE(1, "找不到html缓存"), // 没有缓存
HTML_DOWNLOAD_FAIL(2, "资源加载失败"), // html下载失败
HTML_CACHE_INVALID(3, "html缓存失效"), // html缓存实效
JS_CACHE_INVALID(4, "js缓存失效"), // js
UNKNOWN(10, "unknown");

    public String messsage;
    public int type;

    RxLoadError(int type, String message) {
        this.type = type;
        this.messsage = message;
    }

    public static RxLoadError parse(int type) {
        switch (type) {
            case 0: {
                return ROUTE_NOT_FOUND;
            }
            case 1: {
                return HTML_NO_CACHE;
            }
            case 2: {
                return HTML_DOWNLOAD_FAIL;
            }
            case 3: {
                return HTML_CACHE_INVALID;
            }
            case 4: {
                return JS_CACHE_INVALID;
            }
            default: {
                return UNKNOWN;
            }
        }
    }
}

RxLoadError 是个枚举,虽说 Android 官方不太推荐使用枚举(增大类大小),但是使用方便还是有人多人在用,我觉得如果项目量级不大还是可以使用的,不过也要合理使用,不能为了使用而使用。

使用

使用就简单多了,只要接受的页面进行注册,使用时 post 即可

public void showError(int errorType) {
     Bundle bundle = new Bundle();
     bundle.putInt(Constants.KEY_ERROR_TYPE, errorType);
     BusProvider.getInstance().post(new BusProvider.BusEvent(Constants.EVENT_REXXAR_NETWORK_ERROR, bundle));
 }

接收:

onEventMainThread 名字是固定的,这是要 post 到主线程。

public void onEventMainThread(BusProvider.BusEvent event) {
    if (event.eventId == Constants.EVENT_REXXAR_RETRY) {
        mErrorView.setVisibility(View.GONE);
        reload();
    } else if (event.eventId == Constants.EVENT_REXXAR_NETWORK_ERROR) {
        boolean handled = false;
        RexxarWebViewCore.RxLoadError error = RexxarWebViewCore.RxLoadError.UNKNOWN;
        if (null != event.data) {
            int errorType = event.data.getInt(Constants.KEY_ERROR_TYPE);
            error = RexxarWebViewCore.RxLoadError.parse(errorType);
        }
        if (null != mUriLoadCallback && null != mUriLoadCallback.get()) {
            handled = mUriLoadCallback.get().onFail(error);
        }
        if (!handled) {
            mProgressBar.setVisibility(View.GONE);
            mErrorView.show(error.messsage);
        }
    }
}

Rexxar Android 系列学习其他文章

Rexxar Android 系列学习(1) 项目结构
Rexxar Android 系列学习(2) 路由协议
Rexxar Android 系列学习(3) Native 和 web 交互
Rexxar Android 系列学习(4) 错误处理
Rexxar Android 系列学习(5) 过滤拦截
Rexxar Android 系列学习(6) 缓存机制

你可能感兴趣的:(Rexxar Android 系列学习(4) 错误处理)