ARouter的使用初体验及多模块调用失败问题解决

ARouter是阿里团队开源的一款提供路由功能的中间件,项目地址:https://github.com/alibaba/ARouter。
路由功能对android组件化开发的模块解耦有重要意义,通过本文我们可以先了解ARouter的使用方法以及使用中的常见问题。

使用方法

一、在提供路由功能的模块的build.gradle文件中,添加下述信息

android {
    defaultConfig {
    ...
    javaCompileOptions {
        annotationProcessorOptions {
        arguments = [ moduleName : project.getName() ]
        }
    }
    }
}

dependencies {
    // 替换成最新版本, 需要注意的是api
    // 要与compiler匹配使用,均使用最新版可以保证兼容
    compile 'com.alibaba:arouter-api:x.x.x'
    annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
    ...
}

当前的最新版本在github首页展示,如下图

ARouter的使用初体验及多模块调用失败问题解决_第1张图片
image.png

二、在提供路由功能的模块中,在支持路由的页面上添加注解(必选)。这里的路径需要注意的是至少需要有两级,/xx/xx

@Route(path = "/test/activity")
public class YourActivity extend Activity {
    ...
}

三、宿主App中,初始化ARouter

if (isDebug()) {           // 这两行必须写在init之前,否则这些配置在init过程中将无效
    ARouter.openLog();     // 打印日志
    ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化

四、发起路由操作

// 1. 应用内简单的跳转(通过URL跳转在'进阶用法'中)
ARouter.getInstance().build("/test/activity").navigation();

// 2. 跳转并携带参数
ARouter.getInstance().build("/test/1")
            .withLong("key1", 666L)
            .withString("key3", "888")
            .withObject("key4", new Test("Jack", "Rose"))
            .navigation();

使用问题

There's no router matched!

在组件化开发过程中,我在宿主App模块引用模块C中的Activity,一直不能成功,界面及日志提示"W/ARouter::: ARouter::There is no route match the path [/xxx/xxx], in group [xxx][ ]"
最终定位原因是需要在宿主App的build.gradle中,把需要路由的模块(上例中的模块C)引入进来

//builde.gradle文件
compile project(":moudlec")
compile project(":moudled")

在组件化开发中,各模块建议不要有依赖关系。宿主App在打包编译时可依赖各组件,组件之间可以使用ARouter进行界面跳转。上例中模块c和d之间无依赖关系,但是再宿主app中可以进行跳转。

ARouter::Extract the default group failed

根据github的使用文档,路由路径至少需要有两级:/xx/xx。
使用路由启动Activity时,犯了一个错误,路径名称忘记写首字符/,导致出现了如下报错,引以为戒。

09-06 15:13:45.408 2550-2550/com.example.chenbin.helloas E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: com.example.chenbin.helloas, PID: 2550
                                                                           com.alibaba.android.arouter.exception.HandlerException: ARouter::Extract the default group failed, the path must be start with '/' and contain more than 2 '/'!
                                                                               at com.alibaba.android.arouter.launcher._ARouter.extractGroup(_ARouter.java:228)
                                                                               at com.alibaba.android.arouter.launcher._ARouter.build(_ARouter.java:189)
                                                                               at com.alibaba.android.arouter.launcher.ARouter.build(ARouter.java:140)
                                                                               at com.example.chenbin.helloas.MainActivity$1.onClick(MainActivity.java:37)
                                                                               at android.view.View.performClick(View.java:5207)
                                                                               at android.view.View$PerformClick.run(View.java:21177)
                                                                               at android.os.Handler.handleCallback(Handler.java:739)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:148)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5438)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)

你可能感兴趣的:(ARouter的使用初体验及多模块调用失败问题解决)