vending-processor

为了配合pipeline的执行,每一个函数执行我们都要用Functional类进行包裹。此外我们不希望看到在Activity中出现大量的pipeline代码,而是让iteractor将所有逻辑代码内聚并异步执行。

目前仍需要用Java 7进行Android开发,没有Method Reference特性,每次匿名Functional类都非常啰嗦。因此我们希望通过生成代码来解决这个问题。

配置

在工程中配置gradle:

dependencies {
    apt "com.tencent.mm.vending:vending-processor:0.7.5.2-SNAPSHOT"
}

即可使用vending-processor。

@FunctionalApi

-@FunctionalApi的定义:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface FunctionalApi {
    String value() default TypeConstants.INTERNAL_SCHEDULER_ANY;
    FunctionalPolicy policy() default FunctionalPolicy.Public;
}

@FunctionalApi注解在需要生成Functional封装的函数或接口上,例如在GamesInteractor中:

@FunctionalApi(SchedType.LOGIC)
public int hot(int position) {
    ...
    return position;
}

点击Sync 或 发起javac task

之后,在build/generated/source/apt目录下,我们能找到对应生成的GamesInteractorGlueApi类:

// generated file
public class GamesInteractorGlueApi implements FunctionalGlueApi<GamesInteractor> {
    protected GamesInteractor mOriginalApi;

    public final HotFunctionalApi hot = new HotFunctionalApi();

    public GamesInteractorGlueApi() {
        this(new GamesInteractor());
    }

    public GamesInteractorGlueApi(GamesInteractor originalApi) {
        mOriginalApi = originalApi;
    }

    @Override
    public GamesInteractor originalApi() {
        return mOriginalApi;
    }

    public class HotFunctionalApi implements SchedulerFunctional<Integer, Tuple2<Integer, Integer>> {
        @Override
        public String getSchedulerType() {
          return "Vending.LOGIC";
        }

        @Override
        public Integer call(Tuple2<Integer, Integer> vars) {
          return mOriginalApi.hot(vars.$1(), vars.$2());
        }

        public Pipeable<Integer> invoke(int position, int headerCount) {
          return pipeline(position, headerCount).next(this);
        }
    }
}

如此我们就可以直接new GamesInteractorGlueApi(),然后.hot成员变量就是之前hot()函数的封装,可以直接填入pipeline中,也可以直接调用hot.invoke(int, int),同样返回一个Pipeable对象。

-@FunctionalApi的两个参数分别可以用来设置执行Scheduler和生成封装成员变量的访问修饰符。

@Component

-@Component用于决定生成的封装类,是xxxGlueApi还是xxxDeriveApi,其定义:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface Component {
    ComponentPolicy value() default ComponentPolicy.Default;
}
  • DeriveApi - 生成一个类继承原类,主要用于interface或者abstract class
  • GlueApi - 生成独立的类,接受原类对象作为入参,主要用于普通class

-ComponentPolicy的具体实现

public enum ComponentPolicy {

    /* 根据类型生成代码,interface/abstract类生成Derive接口,而class生成Glue接口 */
    Default,

    /* 指定生成Derive接口,主要针对没有带final的class */
    Derive,

    /* 指定生成Glue接口,针对默认生成Derive接口的类 */
    Glue
}

results matching ""

    No results matching ""