每次使用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 的初始化日志
里面会生成一个 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);
}
这次又浪费我快两个小时!!!这种坑找到我死我也找不出来,更加说明了‘’小菜‘’在引入别人的库一定要谨慎啊,能不用的尽量别用,尤其是没什么人用这个库的时候。