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);
}
}
}