移动 前端 Python Android Java

JavaPoet APT (四)路由通信共享

2020-11-28  本文已影响0人  zcwfeng
通信.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

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

完整项目

上一篇 下一篇

猜你喜欢

热点阅读