概述
一、介绍
离散发生的事件,我们都可以把它抽象成触发器模型,事件因为某种原因发生了,可以抽象成触发器因为某种原因触发了,android世界中的事件也是如此,因为网络发生改变导致触发了网络触发器,因为时间到了,触发了计时触发器。这就是有了基于事件触发的开源框架EventTrigger。目前该开源框架还处于初始阶段,还存在很多不足,欢迎大家都来fork和pull request,把这个框架变得更加完善。
地址:https://github.com/GreatEye/EventTrigger
EventTrigger基本架构如下:
二、使用
开始使用EventTrigger
EventTrigger使用分为4步
Step 1. 添加依赖
在build.gradle添加依赖
compile 'cn.appleye.eventtrigger:library:1.0.2'
在maven中添加依赖
<dependency>
<groupId>cn.appleye.eventtrigger</groupId>
<artifactId>library</artifactId>
<version>1.0.2</version>
<type>pom</type>
</dependency>
Step 2. 定义触发器
框架中已经自带了触发器,你也可以自定义触发器,实现Trigger接口或者继承AbstractTrigger(实现了Trigger接口),以TimerTrigger说明
public class TimerTrigger extends AbstractTrigger{
private static final String TAG = "TimerTrigger";
/**时间间隔*/
private int mInterval;
/**是否结束*/
private boolean mIsFinished;
private static final int MSG_DELAY = 1000;
/**发送延迟消息Handler*/
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_DELAY:{
if(!mIsFinished){
dispatch(null);//派发结果
mHandler.sendEmptyMessageDelayed(MSG_DELAY, mInterval);
}
break;
}
}
}
};
/**
* 构造方法
* @param observer 用于获取当前触发器结果的观察者
* @param interval 时间间隔
* */
public TimerTrigger(Observer observer, int interval) {
super(observer);
mInterval = interval<0?100:interval;//小于0时,定义为100ms
mIsFinished = false;
}
@Override
public String getName() {
return "TimerTrigger";
}
@Override
public void setup() {//初始化工作
if(mIsFinished) {
throw new IllegalStateException("the timer has been stopped");
}
mHandler.sendEmptyMessage(MSG_DELAY);
}
@Override
public void forceTrigger() {//强制调用
//移除延迟消息
mHandler.removeMessages(MSG_DELAY);
//立刻执行
mHandler.sendEmptyMessage(MSG_DELAY);
}
@Override
public void stopTrigger() {//结束计时触发器
mIsFinished = true;
}
}
Step 3. 定义类的方法
@TriggerSubscribe(className = CustomTrigger.class, loopMode = LoopMode.ALWAYS,
strictMode = StrictMode.STRICT)
public void onTriggerChanged(Object result) {
//TODO:处理派发的结果
}
注解TriggerSubscribe参数说明
- className - 表示目标触发器类,缺省Void.class
- loopMode - 表示调用模式, LoopMode.ALWAYS:只要触发器触发就调用,LoopMode.ONCE:调用完一次之后就不再调用,缺省LoopMode.ALWAYS
- strictMode - 表示严格模式, StrictMode.STRICT表示className对应的触发器必须要实现Trigger接口,StrictMode.ALLOW_ALL表示可以是任意触发器,不过所有调用都得自己来实现。缺省StrictMode.STRICT
Step 4. 初始化触发器和注册当前对象
EventTriggerBus实现了Observer接口,将其传入到触发器构造方法当中,触发器将结果派发之后传给EventTriggerBus处理
EventTriggerBus eventTriggerBus = EventTriggerBus.getInstance();//获取实例
eventTriggerBus.register(object);//注册当前对象
CustomTrigger customTrigger = new CustomTrigger(eventTriggerBus);
customTrigger.setOwner(owner);//为了避免不同对象所包含的触发器的影响,这里需要设置触发器所属的对象,全局触发器不需要设置
customTrigger.setup(); //初始化操作
不再使用的时候,需要注销当前对象和停止触发器
customTrigger.stopTrigger();
eventTriggerBus.unregister(object)
另外,经常会用到全局触发器,可以在Application初始化的时候,将实例化触发器即可,下面demo有使用详解,代码实现,请参考EventTrigger
三、使用Demo1.单个类中定义触发器
以TimerTrigger为例
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import java.util.concurrent.atomic.AtomicInteger;
import cn.appleye.eventtrigger.EventTriggerBus;
import cn.appleye.eventtrigger.annotations.TriggerSubscribe;
import cn.appleye.eventtrigger.triggers.Trigger;
import cn.appleye.eventtrigger.triggers.timer.TimerTrigger;
public class TimerTriggerActivity extends AppCompatActivity {
/**显示计时信息控件*/
private TextView mTimerInfoView;
/**计数器*/
private AtomicInteger mValue = new AtomicInteger(0);
private EventTriggerBus mEventTriggerBus;
/**计时器触发器*/
private Trigger mTimerTrigger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timer_trigger);
mTimerInfoView = (TextView) findViewById(R.id.timer_info_view);
//获取EventTriggerBus并且注册当前类
mEventTriggerBus = EventTriggerBus.getInstance();
mEventTriggerBus.register(this);
//初始化触发器
mTimerTrigger = new TimerTrigger(mEventTriggerBus, 1000);//1s间隔
mTimerTrigger.setOwner(this);//设置触发器所有者为当前owner
mTimerTrigger.setup();
}
/**
* 添加注解,用于过滤和得到要订阅的方法
* */
@TriggerSubscribe(className = TimerTrigger.class)
public void onTimerInfoChanged(Object result) {
/*设置值*/
mTimerInfoView.setText(mValue.getAndIncrement() +"");
}
@Override
public void onDestroy() {
super.onDestroy();
//停止触发器,并且注销当前类
mTimerTrigger.stopTrigger();
mEventTriggerBus.unregister(this);
}
}
2.全局触发器用法
以NetworkTrigger为例
Step 1 : 首先在Application中定义全局触发器
public class DemoApplication extends Application{
private static final String TAG = "DemoApplication";
@Override
public void onCreate() {
super.onCreate();
setupGlobalTrigger();
}
/**
* 初始化全局触发器
* */
private void setupGlobalTrigger() {
EventTriggerBus eventTriggerBus = EventTriggerBus.getInstance();
/**添加网络状态变化的触发器*/
Trigger networkTrigger = new NetworkTrigger(eventTriggerBus, this);
networkTrigger.setup();
eventTriggerBus.addGlobalTrigger(networkTrigger);
}
@Override
public void onTerminate(){
super.onTerminate();
//移除所有触发器
EventTriggerBus.getInstance().removeAllGlobalTriggers();
}
}
Step 2 : 注册当前对象
public class NetworkTriggerActivity extends AppCompatActivity {
private TextView mNetworkView;
private EventTriggerBus mEventTriggerBus;
private static final int NETWORK_PERMISSION_REQUEST = 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_network_trigger_demo);
mNetworkView = (TextView) findViewById(R.id.network_info_view);
//注册当前类
mEventTriggerBus = EventTriggerBus.getInstance();
mEventTriggerBus.register(this);
forceNetworkTrigger();//立刻生效
}
@TriggerSubscribe(className = NetworkTrigger.class, loopMode = LoopMode.ALWAYS,
strictMode = StrictMode.STRICT)
public void onNetworkChanged(NetworkState networkState) {
mNetworkView.setText(networkState.toString());
}
/**
* 强制调用网络状态变化触发器
* */
private void forceNetworkTrigger(){
//强制执行当前触发器
mEventTriggerBus.forceCallGlobalTrigger(NetworkTrigger.class);
}
@Override
public void onDestroy() {
super.onDestroy();
mEventTriggerBus.unregister(this);
}
}
四、结束语
EventTrigger还有很多不足,比如自带的Trigger还很少,有待补充,一些使用情景可能考虑不全,后续需要持续优化,不断完善该框架。
最后
以上就是安详果汁为你收集整理的基于事件触发的开源框架EventTrigger的全部内容,希望文章能够帮你解决基于事件触发的开源框架EventTrigger所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复