安卓EventBus使用

EventBus作用:

简化组件之间的通信,可用于线程间的通讯代替handler,用于组件间的通讯代替Intent,用于Activity和Fragment之间通信。

使得代码更简洁,性能更好。

EventBus GitHub地址

EventBus使用方法:

一、导入jar包

    gradle:

compile 'org.greenrobot:eventbus:3.1.1'

    也可下载jar包导入(可在EventBus 的GitHub上找到,3.1.1版本的jar包文末下载的代码中,libs文件夹中找到)

二、 java代码中使用步骤

    1. 注册事件订阅者

		//1.注册 EventBus
		EventBus.getDefault().register(this);  

    2. 发送方发送事件

				//MessageBean 为自己随便定义的一个实体类
				MessageBean messageBean = new MessageBean();
				messageBean.title = "MessageBean Title";
				messageBean.text = "MessageBean Text Content";
				//2. 发送消息
				//	如果是发送粘性消息,使用 EventBus.getDefault().postSticky(event) 发送
				EventBus.getDefault().post(messageBean);

    3. 接收方接收事件

    

	/**
	 * 3.接收消息	方法名可随便写,只需加上注解即可<br/>
	 * 3.1 ThreadMode取值,及其意义
	 * 	POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
	 * 	MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
	 * 	BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。
	 * 		如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,
	 * 		如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
	 * 	ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
	 * 
	 * 3.2 priority:优先级
	 * 	优先级则为一个1000以内的整数,优先级高的可以拦截事件向下传递
	 * 	EventBus.getDefault().cancelEventDelivery(event) ;
	 * 
	 * 3.3 stick:是否为粘性事件,默认false
	 * 	粘性事件可以先发送事件,再注册监听
	 * 
	 * @param message
	 */
	@Subscribe(threadMode = ThreadMode.MAIN,priority = 100,sticky = false) //在ui线程执行,优先级为100  
	public void onEvent(MessageBean message){  
		tv1.setText(message.title);
		tv2.setText(message.text);
	}  

    4. 解注册事件订阅者

		//4.解注册EventBus,防止内存泄露
		EventBus.getDefault().unregister(this);  

    其中,事件的类名,类结构,接收事件的方法名,都可随便定义。

三、 使用示例

    1. 第一个界面 MainActivity.java

        实现 注册事件订阅者,接收方接收事件,解注册事件订阅者 三个步骤

        发送事件由第二个界面实现。

package com.test.activity;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

import com.example.eventbustest.R;
import com.test.bean.MessageBean;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity{
	private Button startNewActivity;
	private TextView tv1,tv2;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv1 = (TextView) findViewById(R.id.textView1);
		tv2 = (TextView) findViewById(R.id.textView2);
		startNewActivity = (Button) findViewById(R.id.start_new_activity);
		/**
		 * 按钮点击事件,跳转到一个新的页面
		 * 新的页面中演示通过EventBus发送消息
		 */
		startNewActivity.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(MainActivity.this, SecondActivity.class);
				startActivity(intent);
			}
		});
		//1.注册 EventBus
		EventBus.getDefault().register(this);  
		
	}
	
	
	/**
	 * 3.接收消息	方法名可随便写,只需加上注解即可<br/>
	 * 3.1 ThreadMode取值,及其意义
	 * 	POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
	 * 	MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
	 * 	BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。
	 * 		如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,
	 * 		如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
	 * 	ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
	 * 
	 * 3.2 priority:优先级
	 * 	优先级则为一个1000以内的整数,优先级高的可以拦截事件向下传递
	 * 	EventBus.getDefault().cancelEventDelivery(event) ;
	 * 
	 * 3.3 stick:是否为粘性事件,默认false
	 * 	粘性事件可以先发送事件,再注册监听
	 * 
	 * @param message
	 */
	@Subscribe(threadMode = ThreadMode.MAIN,priority = 100,sticky = false) //在ui线程执行,优先级为100  
	public void onEvent(MessageBean message){  
		tv1.setText(message.title);
		tv2.setText(message.text);
	}  
	
	
	@Override
	protected void onDestroy() {
		//4.解注册EventBus,防止内存泄露
		EventBus.getDefault().unregister(this);  
		super.onDestroy();
	}
}

    2. 第二个界面 SedondActivity.java

        实现 发送方发送事件

package com.test.activity;

import org.greenrobot.eventbus.EventBus;

import com.example.eventbustest.R;
import com.test.bean.MessageBean;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class SecondActivity extends Activity{

	private Button sendMessage;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		sendMessage = (Button) findViewById(R.id.send_message);
		sendMessage.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				
				MessageBean messageBean = new MessageBean();
				messageBean.title = "MessageBean Title";
				messageBean.text = "MessageBean Text Content";
				//2. 发送消息
				//	如果是发送粘性消息,使用 EventBus.getDefault().postSticky(event) 发送
				EventBus.getDefault().post(messageBean);
			}
		});
	}
}

    3. 事件实体类

package com.test.bean;

/**
 * 事件实体类<br/>
 * 类的名称,结构都可灵活变动<br/>
 * 仅做示例使用,实际项目中如果不需要,也可不写这个类
 * @author Administrator
 *
 */
public class MessageBean {
	public String title;
	public String text;
}

示例代码下载地址:

http://download.csdn.net/download/qq_34763699/10273749

百度网盘  https://pan.baidu.com/s/1A7k7ezf7u9ckhsc2SoRGnA






猜你喜欢

转载自blog.csdn.net/qq_34763699/article/details/79467327