高级配置

WMRouter提供了一系列灵活的可选配置项,实现更好的性能、可靠性,满足更多定制化需求。

初始化性能与懒加载

WMRouter中,加载注解配置的页面、加载Service涉及到资源文件的读取解析、反射获取Class和创建实例,存在一定的性能消耗。为避免初始化时间过长影响App启动速度,一些组件会使用懒加载机制进行初始化(具体实现可参考LazyInitHelper):

  • 一些初始化任务可以在使用时在主线程按需初始化。
  • 也可以在App启动时在后台线程提前初始化,使用时会先等待初始化完成。

因此为了提高App运行性能,初始化时除了在主线程调用init,还可以在后台线程调用lazyInit()提前启动一些懒加载的初始化操作,示例如下:

  1. void initRouter(Context context) {
  2. // 必选,需要在主线程执行
  3. Router.init(new DefaultRootUriHandler(context));
  4. // 其他各种配置
  5. // ...
  6. // 后台线程懒加载
  7. new AsyncTask<Void, Void, Void>() {
  8. @Override
  9. protected Void doInBackground(Void[] objects) {
  10. Router.lazyInit();
  11. return null;
  12. }
  13. }.execute();
  14. }

配置检查与Debugger配置

使用注解进行配置,注解往往分散在一个工程的不同代码文件甚至不同的工程中。如果没有很好的文档或代码约束,很容易出现多个页面配置了相同的URI或Service导致冲突的问题。

因此WMRouter在注解生成阶段、APK打包阶段,使用AnnotationProcessor和Gradle插件进行检查,检查到配置冲突或错误会抛异常,中断编译。

WMRouter中的Debugger用于调试和Log输出,运行时也会对一些配置进行检查,如果出现配置用法错误或其他严重问题会调用Debugger.fatal()抛出。

Debugger建议配置使用DefaultLogger:

  • 测试环境下开启Debug模式,fatal错误会抛出异常及时暴漏问题;

  • 线上环境关闭Debug模式,发生问题不抛异常;可以通过覆写DefaultLogger上报Error和Fatal级别的问题。

代码如下:

  1. // 自定义Logger
  2. DefaultLogger logger = new DefaultLogger() {
  3. @Override
  4. protected void handleError(Throwable t) {
  5. super.handleError(t);
  6. // 此处上报Fatal级别的异常
  7. }
  8. };
  9. // 设置Logger
  10. Debugger.setLogger(logger);
  11. // Log开关,建议测试环境下开启,方便排查问题。
  12. Debugger.setEnableLog(true);
  13. // 调试开关,建议测试环境下开启。调试模式下,严重问题直接抛异常,及时暴漏出来。
  14. 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示例如下:

  1. // 自定义RootUriHandler
  2. public class CustomRootUriHandler extends RootUriHandler {
  3. // ...
  4. public CustomRootUriHandler() {
  5. // 添加Uri注解支持
  6. addHandler(new UriAnnotationHandler());
  7. // 添加一个自定义的HttpHandler
  8. addHandler(new CustomHttpHandler());
  9. }
  10. }
  11. // 自定义UriRequest
  12. public class CustomUriRequest extends UriRequest {
  13. // ...
  14. public CustomUriRequest setCustomProperties(String s) {
  15. putField("custom_properties", s);
  16. return this;
  17. }
  18. }
  19. // 初始化
  20. Router.init(new CustomRootUriHandler());
  21. // 启动Uri
  22. CustomUriRequest request = new CustomUriRequest(mContext, url)
  23. .setCustomProperties("xxx");
  24. Router.startUri(request);