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
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" 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" android:orientation="vertical" > <relativelayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.5" android:orientation="vertical"> <textview android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerinparent="true" android:gravity="center" android:text="welcome" android:textsize="30sp" android:textcolor="#333333"/> </relativelayout> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0.5" android:orientation="vertical"> <android.support.design.widget.textinputlayout android:id="@+id/usernamewrapper" android:layout_width="match_parent" android:layout_height="wrap_content"> <edittext android:id="@+id/username" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputtype="textemailaddress" android:hint="username"/> </android.support.design.widget.textinputlayout> <android.support.design.widget.textinputlayout android:id="@+id/passwordwrapper" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/usernamewrapper" android:layout_margintop="4dp"> <edittext android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputtype="textpassword" android:hint="password"/> </android.support.design.widget.textinputlayout> <button android:id="@+id/btn" android:layout_margintop="4dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="login"/> </linearlayout> </linearlayout>
activity_second.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_second" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <linearlayout android:layout_width="match_parent" android:layout_height="60dp" android:gravity="center"> <button android:id="@+id/button" android:layout_width="100dp" android:layout_height="match_parent" android:text="接收数据" /> </linearlayout> <linearlayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/uname" android:layout_weight="1" /> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/upass" android:layout_weight="1" /> </linearlayout> </linearlayout>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 这才叫烟花,酷炫了