Android事件總線紛發庫EventBus的使用方法

一,什麼是事件總線紛發?

事件紛發是指將事件放入隊列,用於管理和紛發;它能保證應用各部件之間高效的通信以及數據,事件的紛發,可以使各模塊之間高內聚,低耦合,用於模塊間解耦

二,EventBus介紹

Event Bus是一個發佈 /訂閱的事件總線。 Event Bus模式 —也被稱爲MessageBus或者發佈者/訂閱者(publisher/subscriber)模式 —可以讓兩個組件相互通信,但是他們之間並不相互知曉。基於事件總線管理/訂閱/分發模式的。事件響應有更多的線程選擇, EventBus
可以向不同的線程中發佈事件。 EventBus支持 Sticky Event。使用時需要先註冊訂閱,然後向訂閱者分發消息數據即可。包含4個成分:發佈者,訂閱者,事件,總線。訂閱者可以訂閱多個事件,發送者可以發佈任何事件,發佈者同時也可以是訂閱者。分訂閱、註冊、發佈、取消註冊等步驟。

三,EventBus的主要方法

EventBus有訂閱,註冊,發佈,取消註冊等方法

註冊:

<span style="font-size:14px;">//註冊
EventBus.getDefault().register(this);
EventBus.getDefault().register(new MyClass());
//參數:消息接收(訂閱)者    接收方法名   事件類
EventBus.getDefault().register(this,"setText",setEventText.class);</span>

發佈:

// 發佈
EventBus.getDefault().post(myEvent);
EventBus.getDefault().postSticky(new SecondActivityEvent("Message From
SecondActivity"));

接收訂閱:

//接收處理訂閱的方法
onEvent();
onEventMainThread();
onEventbackgroundThread();
onEventAsync();

取消註冊:

<span style="font-size:18px;">// 取消註冊
EventBus.getDefault().unregister(this);
</span><pre name="code" class="java"><span style="font-size:18px;">EventBus.getDefault().unregister(new MyClass());</span>


onEvent:如果使用onEvent作爲訂閱函數,那麼該事件在哪個線程發佈出來的,onEvent就會在這個線程中運行,也就是說發佈事件和接收事件線程在同一個線程。使用這個方法時,在onEvent方法中不能執行耗時操作,如果執行耗時操作容易導致事件分發延遲。onEventMainThread:如果使用onEventMainThread作爲訂閱函數,那麼不論事件是在哪個線程中發佈出來的,onEventMainThread都會在UI線程中執行,接收事件就會在UI線程中運行,這個在Android中是非常有用的,因爲在Android中只能在UI線程中跟新UI,所以在onEvnetMainThread方法中是不能執行耗時操作的。onEventBackground:如果使用onEventBackgrond作爲訂閱函數,那麼如果事件是在UI線程中發佈出來的,那麼onEventBackground就會在子線程中運行,如果事件本來就是子線程中發佈出來的,那麼onEventBackground函數直接在該子線程中執行。onEventAsync:使用這個函數作爲訂閱函數,那麼無論事件在哪個線程發佈,都會創建新的子線程在執行onEventAsync.

四:EventBus實例:

下面以一個實例介紹接收消息的前兩種方法:

首先在XMl佈局中添加兩個Button用於發送消息,兩個TextView用於顯示接收到的消息:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.eventbus.MainActivity" >

    <TextView
        android:id="@+id/tv_content1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="124dp"
         android:text="1"/>

    <Button
        android:id="@+id/btn_send1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="55dp"
        android:layout_toLeftOf="@+id/tv_content1"
        android:text="發送消息1" />

    <Button
        android:id="@+id/btn_send2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/btn_send1"
        android:layout_alignBottom="@+id/btn_send1"
        android:layout_toRightOf="@+id/tv_content1"
        android:text="發送消息2" />

    <TextView
        android:id="@+id/tv_content2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tv_content1"
        android:layout_marginTop="26dp"
        android:layout_toRightOf="@+id/btn_send1"
        android:text="2" />

</RelativeLayout>
建一個MyEvent對象:

public class MyEvent {
	
	String name;
	String company;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getCompany() {
		return company;
	}
	public void setCompany(String company) {
		this.company = company;
	}
}

在MainActivity.class中添加如下代碼:

private TextView tv_content1;
	private TextView tv_content2;
	private Button btn_send1;
	private Button btn_send2;

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

		initView();
	}

	private void initView() {
		tv_content1 = (TextView) this.findViewById(R.id.tv_content1);
		tv_content2 = (TextView) this.findViewById(R.id.tv_content2);
		btn_send1 = (Button) this.findViewById(R.id.btn_send1);
		btn_send2 = (Button) this.findViewById(R.id.btn_send2);
		btn_send1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				MyEvent myEvent = new MyEvent();
				myEvent.setName("賈躍亭");
				myEvent.setCompany("樂視控股");
				// 發佈
				EventBus.getDefault().post(myEvent);
			}
		});
		btn_send2.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				MyEvent myEvent = new MyEvent();
				myEvent.setName("周鴻禕");
				myEvent.setCompany("360");
				// 發佈
				EventBus.getDefault().post(myEvent);
			}
		});
		// 註冊
		EventBus.getDefault().register(this);
	}

點擊按鈕發送消息.

添加onEvent()方法:

public void onEvent(MyEvent myEvent) {
		if (myEvent.getCompany().equals("樂視控股")) {
			tv_content1.setText("賈躍亭  樂視控股");
		}
	}
添加onEventMainThread()方法:

public void onEventMainThread(MyEvent myEvent) {
		if (myEvent.getCompany().equals("360")) {
			tv_content2.setText("周鴻禕  360");
		}
	}
最後在onDestroy()方法中取消註冊(也可以根據需求在合適的地方取消):

@Override
	protected void onDestroy() {
		super.onDestroy();
		// 取消註冊
		EventBus.getDefault().unregister(this);
	}
運行程序:

初始化界面如下圖:

點擊發送消息1,onEvent()接收到消息,顯示內容如下圖:

點擊按鈕發送消息2,onEventMainThread()接收到消息,內容如下圖第二行文字所示:

本文參考了http://blog.csdn.net/harvic880925/article/details/40787203不足之處,歡迎交流指正!

歡迎關注微博,互相交流技術!點擊這裏關注http://weibo.com/momo91




發佈了34 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章