android响应式框架之agera

agera是什么
agera的基本用法1
agera的基本用法2
agera在实际Android开发中使用

agera是什么

agera is a set of classes and interfaces to help wirte functional,asynchronous and reactive applications for Android.Requires Android SDK version 9 or higher.

翻译下:agera是一个能帮助Android开发者更好的开发函数式,异步和响应式程序的框架,要求Android的SDK版本在9以上。

另外:它和RxJava一样,是基于观察者模式开发的。

agera的基本用法1

1、首先定义被观察者

public class MyData extends BaseObservable {
    private String data;//-------->被观察者,数据源

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
        dispatchUpdate();//------->data变化后调用此方法通知所有观察者
    }
}

2、定义观察者—这里我们把Activity作为观察者

public class MainActivity3 extends EActivity implements Updatable{
    private EditText text1;
    private TextView text2;
    private MyData myData;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity3);
        text1 = (EditText) findViewById(R.id.text1);
        text2 = (TextView) findViewById(R.id.text2);
        myData = new MyData();
        text1.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                if(charSequence!=null){
                    myData.setData(charSequence.toString());
                }else{
                    myData.setData("");
                }
            }
            @Override
            public void afterTextChanged(Editable editable) {
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        myData.addUpdatable(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        myData.removeUpdatable(this);
    }

    @Override
    public void update() {
        text2.setText(myData.getData());
    }
}

在EditText监听事件中,更改被观察者(数据源 MyData),数据源改变后会通知所有观察者,在这里Activity作为观察者,执行Activity的update方法。

agera的基本用法2

上面的代码中Observable和Updatable之间的通信,完全没有数据的存在,也就是说当Observable想要传递一些数据给Updatable的时候,通过这样的方式是没办法实现的。这也是Google故意而为之,他们的想法就是要让数据从Observable和Updatable中剥离。

从而达到他们所期望的:Push event,pull data model,不同于RxJava:Push data model。

但是:agera不是为观察者模式服务!!!!

1、首先了解以下几个概念:

(1) Observable:agera中的被观察者,用于在合适的时机去通知观察者进行更新。

(2) Updatable:agera中的观察者,用于观察Observable。

(3) Supplier:agera中提供数据的接口,通过范型指定数据类型,通过get()方法获取数据。

(4) Repository:继承自Observable、Supplier。称作:提供数据的被观察者。

2、结合以下代码看一下:

public class MainActivity3 extends EActivity implements Updatable {
    private Button btn1;
    private TextView text2;
    private Supplier<String> supplier = new Supplier<String>() {
        @NonNull
        @Override
        public String get() {
            return btn1.getText().toString();
        }
    };

    private Repository<String> repository = Repositories.repositoryWithInitialValue("a")
            .observe()
            .onUpdatesPerLoop()
            .thenGetFrom(supplier)
            .compile();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity3);
        btn1 = (Button) findViewById(R.id.button1);
        text2 = (TextView) findViewById(R.id.text2);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                repository.addUpdatable(MainActivity3.this);
            }
        });

    }

    @Override
    public void update() {
        text2.setText(supplier.get());
    }
}

其中,当点击btn1时,将此事件通知到观察者:MainActivity,并执行其中update方法。

agera在实际Android开发中使用

请查看以下代码即可了解:

public class MainActivity extends AppCompatActivity implements Updatable{

private Button observableBtn;
private TextView show;

private ClickObservable clickObservable;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    observableBtn = (Button)findViewById(R.id.observable_btn);
    show = (TextView)findViewById(R.id.show);

    clickObservable = new ClickObservable();
    clickObservable.addUpdatable(this);
    observableBtn.setOnClickListener(clickObservable);
}

@Override
public void update() {
    show.setText("update!!");
}

public static class ClickObservable extends BaseObservable implements View.OnClickListener{

    @Override
    public void onClick(View v) {
        dispatchUpdate();
    }
}
}

其他难点:

整个Repository数据处理流的过程

操作符 Function Attempt Result Receiver Reservoir

wyong wechat
欢迎关注,不定期推送任意内容。
您的支持将鼓励我继续创作!