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
}