文章目录

  • ARouter踩坑指南
    • 导读
    • 添加依赖和配置问题
    • ARouter Helper插件使用问题
    • Kotlin中使用注解@Autowired获取参数问题
    • 进阶用法通过URL跳转理解
    • 使用withObject传递参数
    • 拦截器理解
    • 全局降级和单独降级
    • 实现onActivityResult路由

ARouter踩坑指南

导读

此文章仅记录ARouter使用过程中遇到的坑、理解有误等情况,旨在帮助大家迅速解决问题和理解功能逻辑。

详细使用流程请阅读GitHub源码以及README,地址如下:

ARouter使用指南->GitHub源码以及README

添加依赖和配置问题

如果使用kotlin进行开发,有一套基于kotiln的的依赖方式,在app的build.gradle下添加如下代码:

apply plugin: 'kotlin-kapt'kapt {arguments {arg("AROUTER_MODULE_NAME", project.getName())}
}dependencies {implementation 'com.alibaba:arouter-api:1.5.2'kapt 'com.alibaba:arouter-compiler:1.5.2'...
}

ARouter Helper插件使用问题

ARouter Helper插件帮助我们建立可视化、可操作的路由跳转,非常好用

但如果使用的AnroidStudio版本是4.1及以上版本,ARouter Helper插件是无法使用的,添加插件之后会出现下面的问题

解决方案可以参考Issues里的临时方案,或者等待开发者发布新版本(目前依然是1.0.0版)

Kotlin中使用注解@Autowired获取参数问题

kotlin中如果要使用@Autowired注解需要注意:
1、变量名称必须要跟传入的key保持一致
2、必须使用@JvmField注解修饰
3、必须使用var来修饰

    ARouter.getInstance().build("/xxx/xxx").withParcelable("video", video).navigation()@Autowired@JvmFieldvar video: VideoBean? = null

不然报的错误、、、很难分析问题点在哪里,看下面的截图,你咋分析~

Execution failed for task ‘:kaptDebugKotlin’.
A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction
java.lang.reflect.InvocationTargetException (no error message)

进阶用法通过URL跳转理解

通过url方式跳转,其他模块不需要了解目标模块的包名等信息即可实现跳转路由,可充分解耦

  • 当前Activity通过Scheme方式跳转目标Activity,注意url的参数需与目标Activity在AndroidManifest注册的host和scheme保持一致
  • 新建一个Activity用于监听Scheme事件,之后直接把url传递给ARouter即可
//当前Activity调用Intent跳转 host=www.nobo.com,scheme=wilfried,路由路径为/url/mainstartActivity(Intent(Intent.ACTION_VIEW, Uri.parse("wilfried://www.nobo.com/url/main")))
<!-- AndroidManifest注册SchemeFilterActivity用于中转操作-->  <activity android:name=".url.SchemeFilterActivity"><intent-filter><dataandroid:host="www.nobo.com"android:scheme="wilfried"/><action android:name="android.intent.action.VIEW"/><category android:name="android.intent.category.DEFAULT"/><category android:name="android.intent.category.BROWSABLE"/></intent-filter></activity>
//中转Activity可获取到uri进行使用uri的方式进行跳转,通过NavCallback关闭中转Activityclass SchemeFilterActivity : Activity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val uri = intent.dataLog.i(TAG, "SchemeFilterActivity: $uri")ARouter.getInstance().build(uri).navigation(this, object : NavCallback() {override fun onArrival(postcard: Postcard) {finish()}})}
}

使用withObject传递参数

ARouter支持使用withParcelable、withSerializable和withObject来传递对象,前两者需要类是实现Parcelable或者是实现Serializable的,但是withObject不需要实现任何序列化,他需要使用json2Object、object2Json方式来支持,所以我们必选要实现一个实现了SerializationService的类

/*** 如果跳转的时候需要传递类,需要添加如下类,使用@Route注解修饰*/
@Route(path = "/yourservicegroupname/json")
class JsonServiceImpl : SerializationService {override fun init(context: Context?) {}override fun <T> json2Object(text: String?, clazz: Class<T>?): T {return JSON.parseObject(text, clazz)}override fun object2Json(instance: Any?): String {return JSON.toJSONString(instance)}override fun <T> parseObject(input: String?, clazz: Type?): T {return JSON.parseObject(input, clazz)}
}

拦截器理解

我们使用实现IInterceptor重写process的方式可以实现一个ARouter拦截器,任何路由都会经过拦截器(可以使用绿色通过ARouter.getInstance().build("/home/main").greenChannel().navigation()来跳过拦截器)

实现拦截器之后,不论是否要拦截一定要回调callback.onContinue(postcard)或者callback.onInterrupt(null)。如果我们在路由之前设置了路由状态的监听,那则分别会回调 onArrival,onInterrupt,此处可以来对跳转成功或被拦截做相应操作

//此拦截器未进行任何拦截,仅打印量下log,如果未调用onContinue或者onInterrupt则路由不会成功,排查问题还不好排查,尤其注意下。process可根据patch拦截固定路由
class TestInterceptor : IInterceptor {override fun init(context: Context?) {Log.i(TAG, "TestInterceptor init ")}override fun process(postcard: Postcard?, callback: InterceptorCallback?) {Log.i(TAG, "TestInterceptor init ${postcard?.path}")callback?.onContinue(postcard)}
}

发起路由的Activity,是否被拦截会分别调用onArrival、onInterrupt

ARouter.getInstance().build("/test/activity4").navigation(this, new NavCallback() {@Overridepublic void onArrival(Postcard postcard) {Log.d("ARouter", "通过");}@Overridepublic void onInterrupt(Postcard postcard) {Log.d("ARouter", "被拦截了");}});

全局降级和单独降级

对于降级的理解,其实就是路由跳转失败之后会调用onLost回调来给出一个路由失败策略,而全局降级则是会给出一个统一的策略,单独降级则需要在navigation时单独处理onLost回调

  • 定义全局降级
//实现DegradeService接口,并加上一个 **Path内容任意** 的注解
@Route(path = "/xxx/xxx")
class GlobalDegradeService : DegradeService {override fun init(context: Context?) {Log.i(TAG, "GlobalDegradeService init: ")}override fun onLost(context: Context?, postcard: Postcard?) {Log.i(TAG, "GlobalDegradeService 全局降级: ")}
}
  • 定义单独降级
ARouter.getInstance().build("/main/main2").navigation(this, object :NavCallback() {override fun onLost(postcard: Postcard?) {Log.i(TAG, "onLost: 单独降级 ")}override fun onArrival(postcard: Postcard?) {Log.i(TAG, "onArrival: ")}})

注意:抽象类 NavCallback实现了NavigationCallback,所以我们可以只实现部分我们关心的方法,onArrival方法仍为抽象方法,必须实现

public abstract class NavCallback implements NavigationCallback {@Overridepublic void onFound(Postcard postcard) {// Do nothing}@Overridepublic void onLost(Postcard postcard) {// Do nothing}@Overridepublic abstract void onArrival(Postcard postcard);@Overridepublic void onInterrupt(Postcard postcard) {// Do nothing}
}

实现onActivityResult路由

使用带返回值方式进行路由,navigation方法提供了使用requestCode参数的构造方法,我们可以使用此构造方法来进行路由,然后重写onActivityResult方法, 但是requestCode的值不能小于0否则不会回调onActivityResult方法(源码中判断requestCode>=0),并且根据log很难排查 ,此处需特别注意

ARouter.getInstance().build("/test/activity2").navigation(this, -1);//不会回调onActivityResult

ARouter踩坑指南相关推荐

  1. pytorch .item_从数据到模型,你可能需要1篇详实的pytorch踩坑指南

    原创 · 作者 | Giant 学校 | 浙江大学 研究方向 | 对话系统.text2sql 熟悉DL的朋友应该知道Tensorflow.Pytorch.Caffe这些成熟的框架,它们让广大AI爱好者 ...

  2. tabbar角标 小程序_【沃行课堂】恭喜你遇到“坑”,小程序踩坑指南

    上周我们的开发小哥哥带领我们一起领略了开发中遇到的各种问题,以及基于SaaS模式的平台技术架构及实现.本周我们换个方向,由高级开发工程师秋哥带领大家共同探讨下小程序开发中踩过的坑.秋哥会从公司的几个小 ...

  3. Git Commit Message校验踩坑指南

    背景 在团队多人开发中,规范的commit message可以快速定位代码提交历史,回溯问题根源,方便组内多人协作,提高团队效率. 本篇文章主要包含以下两方面内容: commitizen/cz-cli ...

  4. MacBook通过XGP玩女神异闻录5皇家版不踩坑指南

    XGP是微软Xbox游戏通行证服务,全称Xbox Game Pass,俗称西瓜皮. 女神异闻录5皇家版(P5R)登录了全平台,XGP会员可以通过云游戏在MacBook中游玩,本篇为MacBook玩P5 ...

  5. 联调中通wincall平台-踩坑指南

    开发踩坑指南 初始化阶段 new CTIPlus({token: user.token, //tokenagentPhone: user.phone, //坐席工号或者手机号agNo: user.ag ...

  6. Spring Cloud踩坑指南

    Spring Cloud踩坑指南 1 Spring Cloud搭建 参考 Spring Cloud 微服务技术栈:搭建高可用 Eureka Server.服务注册与发现 2 常见问题 2.1 修改ho ...

  7. openssl开发库安装时的踩坑指南

    序 前几天用linux编译一个提权脚本的时候报错 openssl/opensslv.h: 没有那个文件或目录 的问题 无论如何也解决不了,这下我记录一个踩坑指南防止下一个人掉进坑里 操作 总体介绍 首 ...

  8. Pychram连接mist远程服务器踩坑指南

    Pychram连接mist远程服务器踩坑指南 ##Mist使用方法 首先需要到MistGpu官网注册一个账号,注册就送8元的免费体验,Mist官网:https://mistgpu.com/,然后选择创 ...

  9. 阿里云天池【Docker练习场】踩坑指南

    阿里云天池[Docker练习场]踩坑指南 题目直达 提交环境搭建(基于macOS) Docker的安装与基本功能使用 Docker安装过程遇到的小问题 提交结果注意事项 提交时的镜像配置 项目结构规范 ...

最新文章

  1. 教你制作可以随身携带的FreeBSD系统[转]
  2. C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介...
  3. [python、flask] - POST请求
  4. 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流
  5. 将Java EE与jOOQ结合使用的初学者指南
  6. 普惠金融在印尼:GoPay会是东南亚的蚂蚁金服吗?
  7. java基于ssm的个人博客系统_一个基于 Spring Boot 的开源免费博客系统
  8. 8分钟搞清波士顿动力进化史 | 视频
  9. “C# 未在本地计算机上注册microsoft.Jet.OLEDB.12.0”的解决方案
  10. 博图如何上载wincc程序_博途Wincc:新手4分钟学会两种VB语句,实现西门子Wincc V14 判断功能...
  11. HTML5是不是解决跨平台问题的终极密钥
  12. catia怎么添加毛坯_CATIA教程
  13. 策略和投资组合分析-收益分析、风险回报分析和回撤分析
  14. 安卓ASO怎么做?有哪些工具平台?安卓aso工具有哪些
  15. 北美票房:《玻璃先生》无悬念夺魁
  16. dict后缀_基本数据类型(dict)
  17. 论坛发贴与跟贴的技巧
  18. C# HMACSHA1 加密
  19. RHEL8.0快速入门系列笔记--理论知识储备(一)
  20. 字符串中空格符 空字符

热门文章

  1. 慢慢读《Deep Learning In Natural Language Processing》(一)
  2. python图案填充_用matplotlib用自定义图案填充多边形
  3. 基于Java毕业设计校园外卖系统Web端源码+系统+mysql+lw文档+部署软件
  4. 如何查看win 10 无线密码
  5. 2020年系统规划与管理师上午真题及答案解析
  6. simulink如何进行多模型仿真
  7. 显卡超频稳定测试软件,显卡超频稳定性测试终极手段
  8. C++播放音频mav文件和mp3文件
  9. 人工智能公司排名百度,持续更新~
  10. vim插入模式小技巧