美文网首页
ARouter的使用初体验及多模块调用失败问题解决

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

作者: zizi192 | 来源:发表于2017-09-07 13:43 被阅读0次

    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)
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/zbqvjxtx.html