Arouter 的坑 ARouter::There is no route match the path

每次使用Arouter 在第一次使用的时候一定会出现,ARouter::There is no route match the path,浪费了很多时间去调试!这次自己写demo 的时候又出现了,很无语!

1.gradle 配置


    implementation rootProject.ext.dependencies["arouter"]
    annotationProcessor rootProject.ext.dependencies["arouter-compiler"]
   javaCompileOptions {
            annotationProcessorOptions {
                arguments = [moduleName: project.getName()]
            }
        }

2.使用之前需要init

public class App extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        initLibs();
    }


    private void initLibs(){
        Utils.init(this);
        ARouter.init(this);
        if(AppUtils.isAppDebug()){
            ARouter.openLog();
            ARouter.openDebug();
        }
    }
}

3.随便用一下

     Observable.just(true).
                delay(1, TimeUnit.SECONDS, Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread()).
                compose(this.bindToLifecycle()).
                subscribe(aBoolean -> {
                    ARouter.getInstance().build("/main/HomeActivity")
                            .navigation();
                    finish();
                });

然后就出现了 跳转失败!

不是第一次出现,配置初始化不可能有问题,其他项目也都是这样,最开始怎么弄都不行,后面突然就可以了,其实什么都没改!不过这次实在忍不了!

在gradle console 里面会有一些 Arouter 的初始化日志

Arouter 的坑 ARouter::There is no route match the path_第1张图片

 里面会生成一个 root

ARouter$$Root$$app

找到这个类进去看看

public class ARouter$$Root$$app implements IRouteRoot {
  @Override
  public void loadInto(Map> routes) {
    routes.put("main", ARouter$$Group$$main.class);
    routes.put("splash", ARouter$$Group$$splash.class);
  }
}
/**
 * DO NOT EDIT THIS FILE!!! IT WAS GENERATED BY AROUTER. */
public class ARouter$$Group$$splash implements IRouteGroup {
  @Override
  public void loadInto(Map atlas) {
    atlas.put("/splash/activity", RouteMeta.build(RouteType.ACTIVITY, SplashActivity.class, "/splash/activity", "splash", null, -1, -2147483648));
  }
}
public class ARouter$$Group$$main implements IRouteGroup {
  @Override
  public void loadInto(Map atlas) {
    atlas.put("/main/HomeActivity", RouteMeta.build(RouteType.ACTIVITY, HomeActivity.class, "/main/homeactivity", "main", null, -1, -2147483648));
  }

就是这样现在调着想看看到底是哪的问题的时候又好了!!!

clean 一下重新运行又不行了!!看了下源码,跟上面生成的文件时一样的就是加载不了!

后面找到一个人的博客原文地址!就是下面的问题3

问题1:"W/ARouter::: ARouter::No postcard![ ]" 问题。

这个Log正常的情况下也会打印出来,如果您的代码中没有实现DegradeService和PathReplaceService的话,因为ARouter本身的一些功能也依赖 自己提供的Service管理功能,ARouter在跳转的时候会尝试寻找用户实现的PathReplaceService,用于对路径进行重写(可选功能),所以如果您没有 实现这个服务的话,也会抛出这个日志

推荐在app中实现DegradeService、PathReplaceService

问题2:"W/ARouter::: ARouter::There is no route match the path [/xxx/xxx], in group [xxx][ ]"。

通常来说这种情况是没有找到目标页面,目标不存在
如果这个页面是存在的,那么您可以按照下面的步骤进行排查
检查目标页面的注解是否配置正确,正确的注解形式应该是 (@Route(path="/test/test"), 如没有特殊需求,请勿指定group字段,废弃功能)
检查目标页面所在的模块的gradle脚本中是否依赖了 arouter-compiler sdk (需要注意的是,要使用apt依赖,而不是compile关键字依赖)
检查编译打包日志,是否出现了形如 ARouter:: Compiler >>> xxxxx 的日志,日志中会打印出发现的路由目标
启动App的时候,开启debug、log(openDebug/openLog), 查看映射表是否已经被扫描出来,形如 D/ARouter::: LogisticsCenter has already been loaded, GroupIndex[4],GroupIndex > 0
问题3:开启InstantRun之后无法跳转(高版本Gradle插件下无法跳转)?

因为开启InstantRun之后,很多类文件不会放在原本的dex中,需要单独去加载,ARouter默认不会去加载这些文件,因为安全原因,只有在开启了openDebug之后 ARouter才回去加载InstantRun产生的文件,所以在以上的情况下,需要在init之前调用openDebug

问题4:TransformException:java.util.zip.ZipException: duplicate entry ….

ARouter有按组加载的机制。ARouter允许一个module中存在多个分组,但是不允许多个module中存在相同的分组,会导致映射文件冲突

问题5:Kotlin类中的字段无法注入如何解决?

首先,Kotlin中的字段是可以自动注入的,但是注入代码为了减少反射,使用的字段赋值的方式来注入的,Kotlin默认会生成set/get方法,并把属性设置为private 所以只要保证Kotlin中字段可见性不是private即可,简单解决可以在字段上添加 @JvmField

问题6:通过URL跳转之后,在intent中拿不到参数如何解决?

需要注意的是,如果不使用自动注入,那么可以不写 ARouter.getInstance().inject(this),但是需要取值的字段仍然需要标上 @Autowired 注解,因为 只有标上注解之后,ARouter才能知道以哪一种数据类型提取URL中的参数并放入Intent中,这样您才能在intent中获取到对应的参数

问题7:新增页面之后,无法跳转?

ARouter加载Dex中的映射文件会有一定耗时,所以ARouter会缓存映射文件,直到新版本升级(版本号或者versionCode变化),而如果是开发版本(ARouter.openDebug()), ARouter 每次启动都会重新加载映射文件,开发阶段一定要打开 Debug 功能。

 

按照上面说的改下代码就好了

   private void initLibs(){
        Utils.init(this);
        if(AppUtils.isAppDebug()){
            ARouter.openLog();
            ARouter.openDebug();
        }
        ARouter.init(this);
    }

这次又浪费我快两个小时!!!这种坑找到我死我也找不出来,更加说明了‘’小菜‘’在引入别人的库一定要谨慎啊,能不用的尽量别用,尤其是没什么人用这个库的时候。

你可能感兴趣的:(android)