android事件总线EventBus3.0使用方法详解

这篇文章主要为大家详细介绍了android事件总线EventBus3.0使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一.EventBus概述

1.EventBus的三要素

EventBus有三个主要的元素需要我们先了解一下:

Event:事件,可以是任意类型的对象。
Subscriber:事件订阅者,在EventBus3.0之前消息处理的方法只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,他们分别代表四种线程模型。而在EventBus3.0之后,事件处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为POSTING),四种线程模型下面会讲到。
Publisher:事件发布者,可以在任意线程任意位置发送事件,直接调用EventBus的post(Object)方法。可以自己实例化EventBus对象,但一般使用EventBus.getDefault()就好了,根据post函数参数的类型,会自动调用订阅相应类型事件的函数。

2.EventBus的四种ThreadMode(线程模型)

EventBus3.0有以下四种ThreadMode:

POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。
MAIN:事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。
BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。

二.EventBus的基本用法

1.自定义一个事件类(相当于我们平常所用的bean类)

 public class MessageEvent { ... }

2.在需要订阅的地方注册

 EventBus.getDefault().register(this); 

3.发送事件

第一种.普通事件
EventBus.getDefault().post(messageEvent);
第二种.粘性事件
EventBus.getDefault().postSticky(messageEvent);

4.处理事件(eg.刷新UI)

 @Subscribe(threadMode = ThreadMode.MAIN) public void XXX(MessageEvent messageEvent) { ... } 

5.取消事件订阅

 @Override protected void onDestroy() { EventBus.getDefault().unregister(this); super.onDestroy(); } 

三.EventBus的实际应用(模拟登陆传值)

这里写图片描述

1.导入3.0依赖

compile 'org.greenrobot:eventbus:3.0.0'

2.定义消息事件类

 public class MessageEvent { public final String uname; public final String upass; public MessageEvent(String name,String pass) { this.uname = name; this.upass = pass; } } 

3.发送事件(粘性事件)

 public class MainActivity extends AppCompatActivity { private String username; private String password; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextInputLayout usernameWrapper = (TextInputLayout) findViewById(R.id.usernameWrapper); final TextInputLayout passwordWrapper = (TextInputLayout) findViewById(R.id.passwordWrapper); Button btn = (Button) findViewById(R.id.btn); usernameWrapper.setHint("请输入账号"); passwordWrapper.setHint("请输入密码"); //点击事件 btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { hideKeyboard(); username = usernameWrapper.getEditText().getText().toString(); password = passwordWrapper.getEditText().getText().toString(); if (!validateEmail(username)) { usernameWrapper.setError("Not a valid email address!"); } else if (!validatePassword(password)) { passwordWrapper.setError("Not a valid password!"); } else { usernameWrapper.setErrorEnabled(false); passwordWrapper.setErrorEnabled(false); //发送粘性事件////////////////// EventBus.getDefault().postSticky(new MessageEvent(username,password)); startActivity(new Intent(MainActivity.this,SecondActivity.class)); } } }); } private void hideKeyboard() { View view = getCurrentFocus(); if (view != null) { ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)). hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } //邮箱验证 public boolean validateEmail(String email) { return email.length() > 5; } // 密码验证 public boolean validatePassword(String password) { return password.length() > 5; } } 

4.注册和取消订阅事件

 public class SecondActivity extends AppCompatActivity { private TextView name,pass; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); name= (TextView) findViewById(R.id.uname); pass= (TextView) findViewById(R.id.upass); button= (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //注册EventBus EventBus.getDefault().register(SecondActivity.this); } }); } //事件订阅者处理事件 @Subscribe(threadMode = ThreadMode.POSTING,sticky = true) public void onUserEvent(MessageEvent event) { name.setText("用户名:" + event.uname); pass.setText("用户名:" + event.upass); } //取消注册 @Override protected void onDestroy() { EventBus.getDefault().unregister(this); super.onDestroy(); } } 

布局
activity_main.xml

     

activity_second.xml

    


以上就是android事件总线EventBus3.0使用方法详解的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 移动