搞定Android Agera-00

刚刚阅读完Agera的源码,先写一篇增加搜索曝光度 🙂
阅读源码比阅读文档理解更深,所以开启阅读源码历程(看到好的项目,就去读源码)。
ps:由于RxJava还没研究过,据说是一样的东西,那么从简单的学起吧。

Agera概述

Agera is a super lightweight Android library that helps prepare data for consumption by the Android application components (such as Activities), or objects therein (such as Views), that have life-cycles in one form or another. It introduces a flavor of functional reactive programming, facilitates clear separation of the when, where and what factors of a data processing flow, and enables describing such a complex and asynchronous flow with a single expression, in near natural language.
一句话:Android支持响应式编程(Reactive programming)了。
响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
例如,在命令式编程环境中,a := b + c 表示将表达式的结果赋给a,而之后改变b或c的值不会影响a。但在响应式编程中,a的值会随着b或c的更新而更新。

关键角色

Agera 提供了一个新的事件响应和数据请求的模型,被称之为 “Push event, pull data”。也就是一个事件发生了,会通过回调来主动告诉你,你关心的事件发生了。然后你需要主动的去获取数据,根据获取到的数据做一些操作。
Observable:agera中的被观察者
Updatable: agera中的观察者//Push event
Supplier: agera中提供数据的,通过get()方法获取数据//Pull data
Repository:agera中集成了Observable和Supplier功能的一个[提供数据的被观察者]

实现功能:改变字体颜色

传统的实现方式:

几行代码(设置click事件,然后设置颜色值)

    @Override
    public void init(Bundle savedInstanceState) {
        mBinding = DataBindingUtil.setContentView(this, R.layout.change_txt_color);

        mBinding.btnChangeColor.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        mBinding.setTxtColor(MockRandomData.getRandomColor());
    }

使用Agera实现:

点击Button->触发Update->get颜色值->setColor

点击Button 触发Update Event
    //一个onClick事件被观察者
    mObservable = new OnClickObservable() {
        @Override
        public void onClick(View view) {
            dispatchUpdate();
        }
    };
    //点击Button的时候,dispatchUpdate()
    mBinding.setObservable(mObservable);
    android:onClick="@{observable::onClick}"

Repository关联

    //数据源定义(颜色值)
    Supplier<Integer> supplier = new Supplier<Integer>() {
        @NonNull
        @Override
        public Integer get() {
            return MockRandomData.getRandomColor();
        }
    };
    //
    mRepository = Repositories.repositoryWithInitialValue(0)
            .observe(mObservable)
            .onUpdatesPerLoop()
            .thenGetFrom(supplier)
            .compile();
    //添加Updatable
    @Override
    protected void onResume() {
        super.onResume();
        mRepository.addUpdatable(this);
    }
    //注销Updatable
    @Override
    protected void onPause() {
        super.onPause();
        mRepository.removeUpdatable(this);
    }

set颜色值

    @Override
    public void update() {
        mBinding.setTxtColor(mRepository.get());
    }

GitHub地址

AndroidAgeraTutorial

Reference

  1. Google Agera 从入门到放弃
  2. Agera Wiki
  3. 开启漫漫的agera之旅

发表评论

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