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首页展示,如下图
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)
网友评论