高级配置
WMRouter提供了一系列灵活的可选配置项,实现更好的性能、可靠性,满足更多定制化需求。
初始化性能与懒加载
WMRouter中,加载注解配置的页面、加载Service涉及到资源文件的读取解析、反射获取Class和创建实例,存在一定的性能消耗。为避免初始化时间过长影响App启动速度,一些组件会使用懒加载机制进行初始化(具体实现可参考LazyInitHelper
):
- 一些初始化任务可以在使用时在主线程按需初始化。
- 也可以在App启动时在后台线程提前初始化,使用时会先等待初始化完成。
因此为了提高App运行性能,初始化时除了在主线程调用init,还可以在后台线程调用lazyInit()
提前启动一些懒加载的初始化操作,示例如下:
void initRouter(Context context) {
// 必选,需要在主线程执行
Router.init(new DefaultRootUriHandler(context));
// 其他各种配置
// ...
// 后台线程懒加载
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void[] objects) {
Router.lazyInit();
return null;
}
}.execute();
}
配置检查与Debugger配置
使用注解进行配置,注解往往分散在一个工程的不同代码文件甚至不同的工程中。如果没有很好的文档或代码约束,很容易出现多个页面配置了相同的URI或Service导致冲突的问题。
因此WMRouter在注解生成阶段、APK打包阶段,使用AnnotationProcessor和Gradle插件进行检查,检查到配置冲突或错误会抛异常,中断编译。
WMRouter中的Debugger用于调试和Log输出,运行时也会对一些配置进行检查,如果出现配置用法错误或其他严重问题会调用Debugger.fatal()
抛出。
Debugger建议配置使用DefaultLogger:
测试环境下开启Debug模式,fatal错误会抛出异常及时暴漏问题;
线上环境关闭Debug模式,发生问题不抛异常;可以通过覆写DefaultLogger上报Error和Fatal级别的问题。
代码如下:
// 自定义Logger
DefaultLogger logger = new DefaultLogger() {
@Override
protected void handleError(Throwable t) {
super.handleError(t);
// 此处上报Fatal级别的异常
}
};
// 设置Logger
Debugger.setLogger(logger);
// Log开关,建议测试环境下开启,方便排查问题。
Debugger.setEnableLog(true);
// 调试开关,建议测试环境下开启。调试模式下,严重问题直接抛异常,及时暴漏出来。
Debugger.setEnableDebug(true);
跳转来源与Exported控制
WMRouter在URI跳转时可以通过DefaultUriRequest.from()
设置跳转来源参数,包括内部跳转、外部跳转、来自WebView的跳转、来自Push通知的跳转等,也可以自定义跳转来源,具体实现参考UriSourceTools。
跳转来源可以用于实现Exported控制、埋点统计、特殊业务逻辑等。其中Exported控制类似Android中Activity原生的Exported属性,默认为false,表示不允许来自外部的跳转,从而避免一些安全问题或功能异常。外部跳转由UriProxyActivity统一接收,然后调用WMRouter跳转并设置from为UriSourceTools.FROM_EXTERNAL
,之后UriHandler通过跳转来源和页面的Exported配置即可判断是否允许跳转。
通过UriSourceTools.setDisableExportedControl
可以开启或关闭Exported控制。
降级策略的配置
WMRouter支持配置全局和局部降级策略。
使用RootUriHandler.setGlobalOnCompleteListener()
设置全局跳转完成的监听,可以在其中跳转失败时执行全局降级逻辑。在DefaultRootUriHandler中默认配置的GlobalOnCompleteListener会在跳转失败时弹Toast提示用户。
局部降级策略可以通过组合或覆写UriHandler实现。例如PageAnnotationHandler中设置了NotFoundHandler,当所有RouterPage注解配置的页面都没有匹配时,则使用NotFoundHandler作为降级策略,返回UriResult.CODE_NOT_FOUND
。
核心组件的扩展
根据实际情况,可以自定义具有各种功能的UriHandler和UriInterceptor,前面已经提到,不再赘述。一般使用DefaultRootHandler和DefaultUriRequest,以及少量自定义的UriHandler已经可以满足绝大多数需求。如果有更复杂的场景需要,WMRouter中的核心组件可以通过继承、组合等方式实现更灵活的定制。例如自定义RootUriHandler示例如下:
// 自定义RootUriHandler
public class CustomRootUriHandler extends RootUriHandler {
// ...
public CustomRootUriHandler() {
// 添加Uri注解支持
addHandler(new UriAnnotationHandler());
// 添加一个自定义的HttpHandler
addHandler(new CustomHttpHandler());
}
}
// 自定义UriRequest
public class CustomUriRequest extends UriRequest {
// ...
public CustomUriRequest setCustomProperties(String s) {
putField("custom_properties", s);
return this;
}
}
// 初始化
Router.init(new CustomRootUriHandler());
// 启动Uri
CustomUriRequest request = new CustomUriRequest(mContext, url)
.setCustomProperties("xxx");
Router.startUri(request);