StateFramework——Android状态通知通信快速开发框架

来源:互联网 发布:js 二维数组匹配 编辑:程序博客网 时间:2024/04/26 06:02

StateFramework

简介

StateFramework 以 “状态观察者” 事件为核心的高内聚、低耦合开发框架,兼容性高。

优点

  • 本框架提供代码、注解两种方式实现框架使用
  • 注解只存在于编译期,不存在因为注解而造成的性能问题

GIT

https://github.com/CimZzz/StateFramework

当前版本

0.3.1

下载方法

使用前请确认 buildscript 下 gradle 版本要大于 2.2.0

compile 'com.virtualightning.library:stateframework:0.3.1'annotationProcessor 'com.virtualightning.library:stateframework-compiler:0.3.1'//StateFramework注解处理器,如果你不想用注解的方式绑定可注释此行

核心功能 : 状态观察者

状态观察者简介

“状态”属于无阈值抽象状态,仅作为唯一标识,而 stateId(状态ID)则是其实体

每个 Observer(状态观察者)对应一个 stateId,如果需要 Observer 执行动作时,可以依靠 stateId 进行通知。

如果想要使用 Observer,必须要有一个 StateRecord(状态记录者)作为 Observer 的集合,以 “key - value” 使 stateId 和 Observer 之间建立联系也就是说每个 Observer 必须所属于 StateRecord , StateRecord 与 Observer 属于一对多的关系。

状态观察者的使用

首先需要一个 StateRecord 的实例

StateRecord stateRecord = StateRecord.newInstance(null);//参数为 ClassKey ,注册全局状态观察者时作为所属类型的唯一标识

然后以代码的方式或者注解的方式注册 Observer

  • 代码方式,通过 ObserverBuilder 构建 Observer 所需参数并完成注册
ObserverBuilder observerBuilder = new ObserverBuilder()        .stateId("S_1")//状态ID,类型为 String        .allowStop(false)//是否运行暂停状态           .refType(ReferenceType.WEAK)//状态观察者被持有的引用类型(影响内存泄露)        .runType(RunType.MAIN_LOOP)//状态观察者执行类型        .observer(new BaseObserver() {            @Override            public void notify(Object... objects) {                //通知 Observer 之后所做的一些事            }        });stateRecord.registerObserver(observerBuilder);//注册内部状态观察者//stateRecord.registerWholeObserver(observerBuilder);注册全局状态观察者,ClassKey 为空时会抛出异常
  • 注解方式,需要委托对象与委托方法,下列以 DemoActivity 为例 (需要添加注解解释器的依赖)
public class DemoActivity extends Activity {    StateRecord stateRecord;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        stateRecord = StateRecord.newInstance(DemoActivity.class);        Analyzer.analyzeState(this,stateRecord);//绑定 DemoActivity 的注解到指定的 StateRecord 上    }    @BindObserver(            stateId = "S_1",//注册状态ID             allowStop = false,//是否允许停止            runType = RunType.MAIN_LOOP,//运行类型,当前为运行在主线程            isVarParameters = true,//是否使用自变长参数            isWholeObserver = false//是否为全局状态观察者    )    void onNotifyState_1(Object... args) {        //通知 Observer 之后所做的一些事    }}

完成注册,下面就是通知方法

stateRecord.notifyState("S_1");stateRecord.notifyState("S_1",1,2,3,4);//如果你需要传递参数可以这样

全局状态观察者

StateRecord.notifyWholeState("S_1");//通知全部订阅 "S_1" 的状态观察者

当然也可以通知指定的全局状态观察者

StateRecord.notifyWholeState(ClassKey,"S_1");//通知指定 ClassKey 订阅 "S_1" 的状态观察者

注销状态

使用完之后最好是注销状态

stateRecord.unregisterObserver();

如果注册了全局状态但并未注册,可能会导致内存泄露

关于 allowStop 属性

如果注册 Observer 时启用 allowStop,那么可以通过改变 StateRecord 的状态实现临时禁用 Observer

stateRecord.setRecordState(false);

当 StateRecord 的状态为 false时(stop),通知将不会抵达启用 allowStop 的状态观察者

关于@BindObserver中的 isVarParameters 属性

如果你明确知道委托函数所需的参数类型,可以禁用 isVarParameters ,通知 Observer 所携带的参数会自动转型填充委托函数参数列表

@BindObserver(    stateId = "S_1",//注册状态ID    isVarParameters = false)void onNotifyState_1(String str1,Integer i) {//通知 Observer 之后所做的一些事}

可以使用下列通知方式

stateRecord.notifyState("S_1","HelloWorld",520);

不过需要注意的是,当禁用了 isVarParameters 时,通知时所传递的参数类型、顺序、长度必须严格遵守委托函数定义的参数列表,否则会抛出异常

辅助功能 : 注解绑定注入 (需要添加注解解释器的依赖)

绑定View

使用 @BindView 绑定控件

public class DemoActivity extends Activity {    @BindView(R.id.list)// id 为 R.id.list 必须存在于 R.layout.main    ListView list;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        Analyzer.analyzeView(this);//绑定 DemoActivity 的控件    }}

绑定资源

public class DemoActivity extends Activity {    //资源id = R.array.mainItem , 资源类型 = 字符串数组    @BindResources(resId = R.array.mainItem,type = ResType.STRING_ARRAY)    String[] strArray;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Analyzer.analyzeResources(this);//绑定 DemoActivity 的资源    }}

绑定事件

以点击事件为例,更多事件请参考注解类型集合

public class DemoActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Analyzer.analyzeEvent(this);//绑定 DemoActivity 的资源     }    @OnClick(R.id.list)    void OnClick() {        //点击事件处理的一些事    }}

其余暂未上线功能

  • HTTP协议相关
  • 数据库相关

AndroidStudio 插件

布局快速注入工具安装指南

联系方式

绑定资源 和 事件绑定并不全面,目前只涉及到我项目用的到的,如果需要扩展更多自动注解绑定请联系我

QQ邮箱 : 1152564696@qq.com

QQ : 1152564696

1 0
原创粉丝点击