Android彻底组件化—如何使用Arouter,大厂面经合集

由于自定义类型Author需要跨组件传递,我们知道,DDComponent的核心之处就是在组件之间见了一堵墙,在编译期代码和资源都是完全隔离的,所以Author必须定义在share组件向外提供的服务中。所以我们在component中,定义Author类:

public class Author {
private String name;
private int age;
private String county;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCounty() {
return county;
}
public void setCounty(String county) {
this.county = county;
}
}

现在就解决了Author的可见性问题,但是为了能在路由中传递,按照ARouter的要求,还需要自己实现SerializationService:

@Route(path = “/service/json”)
public class JsonServiceImpl implements SerializationService {
@Override
public void init(Context context) {}
@Override
public T json2Object(String text, Class cla

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

浏览器打开:qq.cn.hn/FTe 开源分享

zz) {
return JSON.parseObject(text, clazz);
}
@Override
public String object2Json(Object instance) {
return JSON.toJSONString(instance);
}
@Override
public T parseObject(String input, Type clazz) {
return JSON.parseObject(input, clazz);
}
}

这里笔者就遇到了一个坑,本来我把这个类定义在readercomponent中,结果运行之后会报空指针异常。只有我把类移到sharecomponent之后,异常才消失。暂时没找到原因,但是定义在这里,加入要跳转到readercomponent怎么办呢?

发起跳转

在组件化框架demo中,发起跳转是readercomponent中的ReaderFragment中,demo中列出了两个示例: 普通跳转

private void goToShareActivityNormal() {
Author author = new Author();
author.setName(“Margaret Mitchell”);
author.setCounty(“USA”);
ARouter.getInstance().build("/share/shareBook")
.withString(“bookName”, “Gone with the Wind”)
.withObject(“author”, author)
.navigation();
}

以及startActivityForResult

private void goToShareActivityForResult() {
Author author = new Author();
author.setName(“Margaret Mitchell”);
author.setCounty(“USA”);
ARouter.getInstance().build("/share/shareMagazine")
.withString(“bookName”, “Gone with the Wind”)
.withObject(“author”, author)
.navigation(getActivity(), REQUEST_CODE);
}

控制生命周期

经过上面的操作,已经可以完成UI跳转了。但是如果运行demo就可以发现,此时即使卸载了分享组件,分享书的页面还是可以进入的,说明生命周期没有同步。在DDComponent自带的方案中是不存在这个问题的,因为跳转的逻辑已经与组件化生命周期绑定在一起。 这里就用到ARouter自带的拦截器功能,每个组件都需要定义一个拦截器,当组件卸载之后需要拦截住该组件的跳转入口。 下面是分享组件拦截器的示例代码:

@Interceptor(priority = 1, name = “分享组件拦截器”)
public class ShareInterceptor implements IInterceptor {
public static boolean isRegister;
Context mContext;
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
if (isRegister) {
callback.onContinue(postcard);
} else if ("/share/shareBook".equals(postcard.getPath())
|| “/share/shareMagazine”.equals(postcard.getPath())) {
MainLooper.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(mContext, “分享组件已经卸载”, Toast.LENGTH_SHORT).show();
}
});
}
}
@Override
public void init(Context context) {
mContext = context;
}
}

这里通过一个isRegister开关来控制拦截器是否生效,为了保证生命周期一致性,在ShareApplike中增加赋值逻辑:

public class ShareApplike implements IApplicationLike {
@Override
public void onCreate() {
ShareInterceptor.isRegister = true;
}
@Override
public void onStop() {
ShareInterceptor.isRegister = false;
}
}

但是这里也遇到了两个小坑,不知道是否是ARouter使用不当: (1)添加或者修改拦截器之后,必须卸载重装app才能生效,不论是clean还是rebuild都是不生效的 (2)拦截器中需要硬编码该组件的所有路由,例如/share/shareBook等,一旦路由发生了改变,一定要记得修改这个地方

路由表生成

这个ARouter暂时没有提供,DDComponent自带的方案增加了这个功能,当组件build生成之后,在根目录生成UIRouterTable文件夹,里面会列出每个组件向外提供的路由表以及具体参数

auto generated, do not change !!!

HOST : share

分享杂志页面
/shareMagazine
author:com.luojilab.componentservice.share.bean.Author
bookName:String

分享书籍页面
/shareBook
author:com.luojilab.componentservice.share.bean.Author
bookName:String
这点对于组件的协同开发是比较重要的,毕竟跳转之前翻阅别人的代码是件比较费事的工作
简单做一个总结:

  1. ARouter是一个优秀的路由跳转方案,DDComponent自带的方案也参考了很多其中的想法,功能很强大
  2. 使用中需要与组件化方案兼容的地方主要是生命周期相关,在拦截器上增加部分逻辑就可以完成
  3. ARouter使用中还存在一些小的问题,可能是姿势不对,接入中走了不少弯路,有熟悉这块的朋友可以指出原因
  4. 路由表没有自动生成,对外没有暴露有哪些路由协议和参数,对于组件之间协同开发不太友好
    上面的代码已经发布DDComponent的master-arouter分支,欢迎大家使用,源码地址: github.com/mqzhangw/An…

你可能感兴趣的:(程序员,面试,android,移动开发)