安卓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.接收消息	方法名可随便写,只需加上注解即可
* 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.接收消息	方法名可随便写,只需加上注解即可
* 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;

/**
 * 事件实体类
* 类的名称,结构都可灵活变动
* 仅做示例使用,实际项目中如果不需要,也可不写这个类 * @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






你可能感兴趣的:(Android)