美文网首页 移动 前端 Python Android Java
JavaPoet APT (四)路由通信共享

JavaPoet APT (四)路由通信共享

作者: zcwfeng | 来源:发表于2020-11-28 19:54 被阅读0次
通信.png

路由图片通信

使用的时候如下:

---> 某个组件模块
 @Parameter(name = "/order/getDrawable")
   OrderDrawable orderDrawable;

ParameterManager.getInstance().loadParameter(this);

((ImageView)findViewById(R.id.image)).setImageResource(orderDrawable.getDrawable());


应用场景:某个模块组件的图片其他组件想要使用,这个时候的处理方式

我们不应该吧所有图片放到common层,这个频繁更改应该交给业务组件。

1.arouter_api Call 标准规则定义(接口定义)

package top.zcwfeng.arouter_api;

/**
 * 组件和组件之间共享
 * 如:图片共享,Bean 共享
 */
public interface Call {
    // TODO: 共享组件 高层定义
}

2. commonOrderDrawable 继承Call order 组图片标准规则的定义

package top.zcwfeng.common.order.drawable;

import top.zcwfeng.arouter_api.Call;

// TODO: 共享组件 暴露接口
public interface OrderDrawable extends Call {
    int getDrawable();
}

3. orderOrderDrawableImpl 这种的具体实现嫁给具体模块order

package top.zcwfeng.order.impl;

import top.zcwfeng.arouter_annotation.ARouter;
import top.zcwfeng.common.order.drawable.OrderDrawable;
import top.zcwfeng.order.R;

// TODO: 组件共享 3 暴露接口
@ARouter(path = "/order/getDrawable")
public class OrderDrawableImpl implements OrderDrawable {
    @Override
    public int getDrawable() {
        return R.drawable.ic_ac_unit_black_24dp;
    }
}

注意 @ARouter(path = "/order/getDrawable") 我们需要生成

RouterManager.getInstance().build("/order/getDrawable").navigation(t);

最终我们会生成这样的代码

目标生成代码.png

4.arouter_compiler ArouterProcess 增加修改代码

5. arouter_compiler ParameterProcess/ParameterFactory 修改代码

6.arouter_api RouterManager/BundleManager 修改代码 ,BundleManager增加Call的定义,RouterManager 扩展跳转

CALL 分支的跳转

...
// TODO 第三步 跳转
            if (loadPath != null) { // 健壮
                if (loadPath.getPathMap().isEmpty()) { // pathMap.get("key") == null
                    throw new RuntimeException("路由表Path报废了...");
                }

                // 最后才执行操作
                RouterBean routerBean = loadPath.getPathMap().get(path);

                if (routerBean != null) {
                    switch (routerBean.getTypeEnum()) {
                        case ACTIVITY:
                            Intent intent = new Intent(context, routerBean.getMyclass()); // 例如:getClazz == Order_MainActivity.class
                            intent.putExtras(bundleManager.getBundle()); // 携带参数
                            context.startActivity(intent, bundleManager.getBundle());
                            break;
                        //可以自己扩展 类型
                        case CALL:
                            Class<?> clazz = routerBean.getMyclass();
                            Call call = (Call) clazz.newInstance();
                            bundleManager.setCall(call);
                            return bundleManager.getCall();
                    }
                }
            }
...

CALL ---> routerBean.getMyclass(); 拿到的是我们注解生成的类

@ARouter(path = "/app/MainActivity")
public class MainActivity extends AppCompatActivity {

    @Parameter(name = "/order/getDrawable")
    OrderDrawable orderDrawable;
。。。

对应注解生成MainActivity$$Parameter

public class MainActivity$$Parameter implements ParameterGet {
  @Override
  public void getParameter(Object targetParameter) {
    MainActivity t = (MainActivity)targetParameter;
    t.orderDrawable = (OrderDrawable)
            RouterManager.getInstance().build("/order/getDrawable").navigation(t);
  }
}

RouterManager.getInstance().build("/order/getDrawable").navigation(t); 通过导航到我们的暴露点Order 模块生成

package top.zcwfeng.customarouter;

import java.lang.Override;
import java.lang.String;
import java.util.HashMap;
import java.util.Map;
import top.zcwfeng.arouter_annotation.bean.RouterBean;
import top.zcwfeng.arouter_api.ARouterPath;
import top.zcwfeng.order.Order_MainActivity;
import top.zcwfeng.order.impl.OrderDrawableImpl;

public class ARouter$$Path$$order implements ARouterPath {
  @Override
  public Map<String, RouterBean> getPathMap() {
    Map<String, RouterBean> pathMap = new HashMap<>();
    pathMap.put("/order/getDrawable", RouterBean.create(RouterBean.TypeEnum.CALL,OrderDrawableImpl.class,
            "/order/getDrawable","order"));
    pathMap.put("/order/Order_MainActivity", RouterBean.create(RouterBean.TypeEnum.ACTIVITY,Order_MainActivity.class,
            "/order/Order_MainActivity","order"));
    return pathMap;
  }
}

最终导航到 OrderDrawableImpl.class

不再是前面Activity级别的Order_MainActivity.class ,而是参数指定的接口实现类

MainActivity-> 懒加载ParameterManager.getInstance().loadParameter(ParameterGet 接口)
-> MainActivity$$Parameter 生成代码的navigation()
-> RouterManager -> 跳转Call 类型
-> 返回我们的暴露点Order 实现 OrderDrawableImpl
-> OrderDrawableImpl#getDrawable()# return R.drawable.ic_ac_unit_black_24dp

这就是OrderDrawable orderDrawable 整个赋值的流程

2020-11-28 15:37:14.897 6002-6002/top.zcwfeng.customarouter E/zcw_arouter: loadParameter 参数接收
2020-11-28 15:37:14.898 6002-6002/top.zcwfeng.customarouter E/zcw_arouter: navigation 路由跳转
2020-11-28 15:37:14.907 6002-6002/top.zcwfeng.customarouter E/zcw_arouter: CALL 跳转类型top.zcwfeng.order.impl.OrderDrawableImpl

路由Bean通信

  1. common IUser 继承Call ,order 组 bean标准定义
  2. order UserInfo Bean资源(相当于 导入图片到Drawable这个步骤)准备资源
  3. order OrderUserImpl 最终的具体实现交给模块Order
  4. 其他模块如,app.MainActivity壳使用Bean /personal.PersonalMainActivity 使用Bean

步骤和图片通信是一致的。

完整项目

相关文章

  • JavaPoet APT (四)路由通信共享

    路由图片通信 使用的时候如下: 应用场景:某个模块组件的图片其他组件想要使用,这个时候的处理方式 我们不应该吧所有...

  • JavaPoet APT(三)组件化路由

    回顾一下之前的调用逻辑。在JavaPoet APT(二) 中我们能用的跳转是这个样子 对于普通调用者来说过于复杂,...

  • 从无到有手写ButterKnife框架

    导航 一、代码的演进二、butterKnife反射调用三、javapoet自动生成模板代码四、apt与注解五、注解...

  • apt相关文章

    1、JavaPoet的基本使用2、java annotation processing tools(APT)实例解...

  • Android组件化实现方案(二)

    APT(Annotation Processing Tool),根据注解自动给生成代码。JavaPoet,代码生成...

  • APT高级用法JavaPoet

    1、什么是JavaPoet JavaPort是square公司推出的开源java代码生成框架,提供Java API...

  • JavaPoet APT (二) 使用

    了解组件化的架构 组件化,业务组件横向是不能有依赖,也就是需要解决组件通信的问题,所以我们要用到路由,业务组件通过...

  • 代码诗人——APT && JavaPoet

    AOP 中, 我们以处理阶段为划分产生了很多可选的技术手段: java 源代码阶段 (apt 、 ksp、 jav...

  • APT学习笔记--JavaPoet

    简介 APT(Annotation Process Tool),是一种编译期间处理注解,按照一定规则生成代码的技术...

  • Android APT:Eclipse下APT使用

    001概述 文章将介绍如何在eclipse下使用apt开发,结合JakeWharton大神的javapoet让ap...

网友评论

    本文标题:JavaPoet APT (四)路由通信共享

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