时间:2021-05-20
一.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
<?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>以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
概述:EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Act
目前大多数开发者使用EventBus或者Otto作为事件总线通信库,对于RxJava使用者来说,RxJava也可以轻松实现事件总线,因为它们都依据于观察者模式。
首先我们要使用的EventBus事件总线,能够做到兄弟组件,或者不是父子关系的页面达到数据相互传递的效果一种做法是在main.js中创建事件总线创建完$Even
Android消息分发使用EventBus的实例详解1.AndroidStudio使用dependencies{//最新版本compile'org.greenr
Android中onSaveInstanceState()使用方法详解覆盖onSaveInstanceState方法,并在onCreate中检测savedIns