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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值