事件总线模式知识总结

颠末对多个有关事故总线模式的文档先容的涉猎,对事故总线模式有了必然的懂得,并作出如下总结: 事故总线模式主如果处置惩罚事故,包括4个主要组件:事故源、事故监听器、通...


当前位置: 主页 > 新蒲萄京网站 >

颠末对多个有关事故总线模式的文档先容的涉猎,对事故总线模式有了必然的懂得,并作出如下总结:

事故总线模式主如果处置惩罚事故,包括4个主要组件:事故源、事故监听器、通道和事故总线。消息源将消息宣布到事故总线上的特定通道上。侦听器订阅特定的通道。侦听器会被看护消息,这些消息被宣布到它们之前订阅的一个通道上。

应用处景:安卓开拓、看护办事

优点:新的宣布者、订阅者和连接可以很轻易地添加。对高度散播式的利用法度榜样有效。

毛病:可伸缩性可能是一个问题,由于所有消息都是经由过程同一事故总线进行的。

事故总线的处置惩罚流程:

实例:事故总线模式是一种广泛运用于安卓开拓之中的一种软件架构模式,而事故总线模式在安卓开拓中最广泛的利用莫过于AndroidStudio供给的EventBus,以是我就EventBus来谈谈对事故总线模式的熟识。

EventBus是Android下高效的宣布/订阅事故总线机制。感化是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间通报数据,履行措施。特征是代码简洁,是一种宣布订阅设计模式(Publish/Subsribe),或称作察看者设计模式。我们可能对事物总线机制照样有点陌生,然则想必对23种软件设计模式之后的察看者模式应该很认识。事物总线模式便是察看者设计模式的一种,它的事情部件主要分为四种:事故源、事故监听器、通道和事故总线。它的主要事情道理:事故源将孕育发生的消息发送到事故总线的特定通道之上,然后监听器在事先会订阅事务总线之中不合的通道以区分消息的相应,然后当消息被发送到事务总线的特定通道之中时,所对应的监听器会监听到消息,然后监听器根据法度榜样中设置的相应函数进行履行。就似乎一个AcTIvity之中设置的Button一样,在xml文件中放入一个Button,然后在java类中设定OnEvent()函数,当Button被点击的时刻,则会传出一个点击消息,然后按钮对应的Onclick()函数,监听到点击消息,从而履行OnListerner()之中的函数。

那么下面我们结合详细的实例来阐发事故总线模式,提到这个模式我们第一个想到的必然是Adroid开拓之中的一个组件——Event Bus。Event Bus是Android Studio官方为我们供给的一个对象包。下面我们就根据一个详细的框架来对Event Bus进行解说。

我们想要实现的一个效果是,有两个acivity如图MainAcTIvity:当点击"click"按钮的时刻,就会跳转到secondAcTIvity,而secondAcTIvity里面有两个按钮,点击今后,可以改变MainActivity里面TextView的翰墨。

要实现这样的效果无非是完成一个消息的通报,相称于我们的察看者模式中宣布者宣布的一个消息,然后订阅者经由过程特定的通道进行监听,着末实现消息的通报。

首先是MainActivity:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

public class MainActivity extends FragmentActivity {

Button btn;

TextView text;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

EventBus.getInstance().register(this);

btn = (Button) findViewById(R.id.btn);

text = (TextView) findViewById(R.id.text);

btn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

startActivity(new Intent(MainActivity.this,SecondActivity.class));

}

});

}

public void onEvent(Info i){

Log.i("cky", i.msg);

}

public void onEventMain(Info i){

text.setText(i.msg);

}

public void onEventMain(Info2 i){

text.setText(text.getText()+i.msg);

}

}

从上面我们可以看出MainActivity的创建函数onCreate函数中调用了EventBus的register(this)函数,用来注册。然后是onEvent(),这个措施里面的代码,会在一个子线程中履行一个是onEventMain(),这个措施里面的代码,会在UI线程履行。

然后是SecondActivity

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

public class SecondActivity extends Activity {

Button btn2;

Button btn3;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_second);

btn2 = (Button) findViewById(R.id.btn2);

btn2.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

EventBus.getInstance().post(new Info("信息1"));

}

});

btn3 = (Button) findViewById(R.id.btn3);

btn3.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

EventBus.getInstance().post(new Info2("信息2"));

}

});

}

}

那么这些活动之中的“始作俑者”——EventBus类又是什么样的呢?

1

2

3

4

5

6

7

8

9

10

11

12

public class EventBus {

HashMap,ArrayList> subscriptionsByEventType =

new HashMap,ArrayList>();

MainThreadHandler mainThreadHandler = new MainThreadHandler(this,Looper.getMainLooper());

AsyThreadHandler asyThreadHandler = new AsyThreadHandler(this);

private final static EventBus instance = new EventBus();

public static EventBus getInstance(){

return instance;

}

private EventBus(){};

}

在这此中:

register措施之中我们先获取了订阅者(例子中是MainActivity)的措施,找到onEvent开首的措施,得到它们的参数类型。然后判断subscriptionsByEventType是否有以这些参数类型为key的数据,假如没有,新建一个ArrayList。

Subscription它代表一个订阅,拥有subsriber,也便是订阅者还有一个SubscriberMethod,这是订阅措施类。

post()措施里面,犹如我们上面所说,获取了参数类型,然后在subscriptionsByEventType中查询所有改类型对应的订阅Subscription对付Subscription,它有我们订阅类的所有信息。首先根据type判断是在主线程照样子线程履行,然后调用一开始讲到的两个类的实例就好了。

invoke()着实只有一句话,便是调用了反射去履行措施。m是订阅措施,sub.subscriber便是订阅者,event便是post()措施传入的实体这样我们就在子线程中调用了这个措施了,相称于MainActivity主动调用这个措施。

由于这个模式的应用较少以是网上可以找到的只有这一种实例,着实事故总线这个观点对你来说可能很陌生,但提到察看者(宣布-订阅)模式,你大概就很认识。事故总线是对宣布-订阅模式的一种实现。它是一种集中式事故处置惩罚机制,容许不合的组件之间进行彼此通信而又不必要互相依附,达到一种解耦的目的。

发表评论
加载中...

相关文章