搞定Android Agera-01

Repository结合了被观察者和数据提供者,接收事件通知,提供数据(Repository.get())。

Repository组成

一个典型Agera风格的响应式Client由以下几部分组成:

  1. 向Observables注册一个Updatable,用于事件通知;
  2. 可直接调用update,来初始化或更改Client状态;
  3. 等待Observables的通知,拉取最新的数据来更新Client;
  4. 向Observables注销updatable,释放资源。

简单的Repository(Simple repositories)

static repository: 提供相同的数据源而且不生成通知事件,只有get()方法;
mutable repository: 可提供变化的数据源(accept输入->get输出),数据变化时生成通知事件.

    private void setUpRepository() {
        mObservable = new OnClickObservable() {
            @Override
            public void onClick(View view) {
                mRepository.accept(MockRandomData.getRandomImage());
            }
        };

        mRepository = Repositories.mutableRepository(MockRandomData.getRandomImage());
    }

复杂的Repository(Complex repositories)

这个真是超复杂,只做个简单的整理。
可以将很多个Repository、Observable串起来,可以指定执行线程(UI/Work Thred),组成一个“命令”执行流,也可以取消和中止这个执行流。
Agera 提供了repository compiler,可以使用近乎自然语言来声明complex repository。

repository compiler

一个典型声明的顺序:


// 1.声明RepositoryCompiler,并初始化,返回REventSource实例。
Repositories.repositoryWithInitialValue(...);

// 2.指定事件源(Observable),可以多个,返回RFrequency实例。
Event sources - .observe(...);

// 3.设置通知频率(比如click频率限制),返回RFlow实例。
Frequency of reaction - .onUpdatesPer(...) or .onUpdatesPerLoop();

// 4.设置数据源(Supplier),返回RFlow或RTermination实例。
Data processing flow - .getFrom(...), .mergeIn(...), .transform(...), etc.;

// 5.设置数据输出?(Function),返回RConfig实例。
Miscellaneous configurations - .notifyIf(...), .onDeactivation(...), etc.;

// 6.生成Repository实例。
.compile()

非常机智的通告返回类型,达到声明指令有序的目的。
goto返回的是Self,所以可以使用在其中任何位置。

    @NonNull
    TSelf goTo(@NonNull Executor executor);

也可以指定懒加载(goLazy)

    @NonNull
    RSyncFlow<TVal, TPre, ?> goLazy();

总结:指定事件源、限制频率、提供数据源、配置执行线程、结果处理(Function)、支持懒加载,简直是无所不能的万种组合。
ps:还有很多其他的方法,后续慢慢用起来。

数据处理流程(Data processing flow)

当进入数据处理流程,Repository.get()的值作为输入值,往下执行,可以做些异常处理:
.attemptXXX返回RTermination
.check()返回RTermination
RTermination可以跳出或者终止数据处理流程

interface RTermination<TVal, TTerm, TRet> {
//跳过所有未完成的data processing flow
@NonNull
TRet orSkip();
//终止未完成的data processing flow,输入结果:termination clause
@NonNull
TRet orEnd(@NonNull Function<? super TTerm, ? extends TVal> valueFunction);
}

GitHub地址

AndroidAgeraTutorial

发表评论

电子邮件地址不会被公开。 必填项已用*标注