ARouter踩坑指南
文章目录
- 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踩坑指南相关推荐
- pytorch .item_从数据到模型,你可能需要1篇详实的pytorch踩坑指南
原创 · 作者 | Giant 学校 | 浙江大学 研究方向 | 对话系统.text2sql 熟悉DL的朋友应该知道Tensorflow.Pytorch.Caffe这些成熟的框架,它们让广大AI爱好者 ...
- tabbar角标 小程序_【沃行课堂】恭喜你遇到“坑”,小程序踩坑指南
上周我们的开发小哥哥带领我们一起领略了开发中遇到的各种问题,以及基于SaaS模式的平台技术架构及实现.本周我们换个方向,由高级开发工程师秋哥带领大家共同探讨下小程序开发中踩过的坑.秋哥会从公司的几个小 ...
- Git Commit Message校验踩坑指南
背景 在团队多人开发中,规范的commit message可以快速定位代码提交历史,回溯问题根源,方便组内多人协作,提高团队效率. 本篇文章主要包含以下两方面内容: commitizen/cz-cli ...
- MacBook通过XGP玩女神异闻录5皇家版不踩坑指南
XGP是微软Xbox游戏通行证服务,全称Xbox Game Pass,俗称西瓜皮. 女神异闻录5皇家版(P5R)登录了全平台,XGP会员可以通过云游戏在MacBook中游玩,本篇为MacBook玩P5 ...
- 联调中通wincall平台-踩坑指南
开发踩坑指南 初始化阶段 new CTIPlus({token: user.token, //tokenagentPhone: user.phone, //坐席工号或者手机号agNo: user.ag ...
- Spring Cloud踩坑指南
Spring Cloud踩坑指南 1 Spring Cloud搭建 参考 Spring Cloud 微服务技术栈:搭建高可用 Eureka Server.服务注册与发现 2 常见问题 2.1 修改ho ...
- openssl开发库安装时的踩坑指南
序 前几天用linux编译一个提权脚本的时候报错 openssl/opensslv.h: 没有那个文件或目录 的问题 无论如何也解决不了,这下我记录一个踩坑指南防止下一个人掉进坑里 操作 总体介绍 首 ...
- Pychram连接mist远程服务器踩坑指南
Pychram连接mist远程服务器踩坑指南 ##Mist使用方法 首先需要到MistGpu官网注册一个账号,注册就送8元的免费体验,Mist官网:https://mistgpu.com/,然后选择创 ...
- 阿里云天池【Docker练习场】踩坑指南
阿里云天池[Docker练习场]踩坑指南 题目直达 提交环境搭建(基于macOS) Docker的安装与基本功能使用 Docker安装过程遇到的小问题 提交结果注意事项 提交时的镜像配置 项目结构规范 ...
最新文章
- 教你制作可以随身携带的FreeBSD系统[转]
- C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介...
- [python、flask] - POST请求
- 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流
- 将Java EE与jOOQ结合使用的初学者指南
- 普惠金融在印尼:GoPay会是东南亚的蚂蚁金服吗?
- java基于ssm的个人博客系统_一个基于 Spring Boot 的开源免费博客系统
- 8分钟搞清波士顿动力进化史 | 视频
- “C# 未在本地计算机上注册microsoft.Jet.OLEDB.12.0”的解决方案
- 博图如何上载wincc程序_博途Wincc:新手4分钟学会两种VB语句,实现西门子Wincc V14 判断功能...
- HTML5是不是解决跨平台问题的终极密钥
- catia怎么添加毛坯_CATIA教程
- 策略和投资组合分析-收益分析、风险回报分析和回撤分析
- 安卓ASO怎么做?有哪些工具平台?安卓aso工具有哪些
- 北美票房:《玻璃先生》无悬念夺魁
- dict后缀_基本数据类型(dict)
- 论坛发贴与跟贴的技巧
- C# HMACSHA1 加密
- RHEL8.0快速入门系列笔记--理论知识储备(一)
- 字符串中空格符 空字符
热门文章
- 慢慢读《Deep Learning In Natural Language Processing》(一)
- python图案填充_用matplotlib用自定义图案填充多边形
- 基于Java毕业设计校园外卖系统Web端源码+系统+mysql+lw文档+部署软件
- 如何查看win 10 无线密码
- 2020年系统规划与管理师上午真题及答案解析
- simulink如何进行多模型仿真
- 显卡超频稳定测试软件,显卡超频稳定性测试终极手段
- C++播放音频mav文件和mp3文件
- 人工智能公司排名百度,持续更新~
- vim插入模式小技巧