Android实现EventBus登录界面与传值(粘性事件)
什么是EventBus?
EventBus 是一种Android中非常流行的事件发布/订阅框架。它的主要特点是解耦,发布者和订阅者互不干扰,只需要定义好事件和事件处理函数,EventBus会自动将事件投递到对应的事件处理函数中。使用EventBus可以大大简化Activity、Fragment等组件间数据传递的问题,促进代码的复用和解耦。
EventBus的实现
导入依赖
在 app/build.gradle 文件中导入EventBus依赖:
dependencies {
implementation 'org.greenrobot:eventbus:3.2.0'
}
定义事件类
首先需要定义事件类(例如:LoginEvent), 用来传递数据,定义好事件类之后,在需要发出事件的地方,将事件对象post出去即可。
public class LoginEvent {
private String userName;
private String password;
public LoginEvent(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String getUserName() {
return userName;
}
public String getPassword() {
return password;
}
}
注册订阅者
在Activity中注册成为EventBus的订阅者,接收事件并进行处理。在onCreate方法中注册,这里我们需要定义一个方法来接收事件,方法必须是public和void,参数和事件类相同。
public class LoginActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
EventBus.getDefault().register(this);
}
@Subscribe
public void onLoginEvent(LoginEvent event) {
// 处理事件
String userName = event.getUserName();
String password = event.getPassword();
// TODO:登录操作
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
发布事件
在需要传递数据的地方(例如:登录按钮事件处理函数)创建事件对象并post出去。
public void login(View view) {
String userName = mEtUserName.getText().toString();
String password = mEtPassword.getText().toString();
LoginEvent event = new LoginEvent(userName, password);
EventBus.getDefault().post(event);
}
这样,我们就完成了一个基本的EventBus事件传递和处理的过程。但如果需要使用粘性事件呢?
EventBus粘性事件使用
发布粘性事件
发起事件时使用EventBus.getDefault().postSticky()方法即可将事件发送为“粘性事件”:
LoginEvent event = new LoginEvent(userName, password);
EventBus.getDefault().postSticky(event);
订阅粘性事件
订阅者通过调用EventBus.getDefault().getStickyEvent()方法来获取最近一次发送的“粘性事件”。
LoginEvent event = EventBus.getDefault().getStickyEvent(LoginEvent.class);
if (event != null) {
// 处理事件
String userName = event.getUserName();
String password = event.getPassword();
// TODO: 登录操作
}
需要注意的是,如果订阅者在使用完粘性事件之后,没有手动删除该事件,那么该粘性事件会一直保存在内存中,直到订阅者调用removeStickyEvent()方法手动删除为止。
示例说明
示例一:使用EventBus传递参数
在MainActivity中定义一个登录按钮的点击事件,当用户点击登录按钮时,触发该事件,创建一个LoginEvent对象,并携带用户名和密码信息,在点击事件中通过EventBus发布这个事件,登录窗口接受事件并进行相应的处理。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void login(View view) {
String userName = "admin";
String password = "123456";
LoginEvent event = new LoginEvent(userName, password);
EventBus.getDefault().post(event);
finish();
}
}
public class LoginActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
EventBus.getDefault().register(this);
}
@Subscribe
public void onLoginEvent(LoginEvent event) {
String userName = event.getUserName();
String password = event.getPassword();
// TODO:登录操作
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
示例二:使用EventBus粘性事件传递参数
在MainActivity中定义一个登录按钮的点击事件,当用户点击登录按钮时,触发该事件,创建一个LoginEvent对象,并携带用户名和密码信息,在点击事件中通过EventBus发布这个事件为粘性事件,登录窗口接收粘性事件,并进行相应的处理。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void login(View view) {
String userName = "admin";
String password = "123456";
LoginEvent event = new LoginEvent(userName, password);
EventBus.getDefault().postSticky(event);
finish();
}
}
public class LoginActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
EventBus.getDefault().register(this);
}
@Subscribe(sticky = true)
public void onLoginEvent(LoginEvent event) {
String userName = event.getUserName();
String password = event.getPassword();
// TODO:登录操作
EventBus.getDefault().removeStickyEvent(event);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
以上就是使用EventBus实现登录界面与传值(粘性事件)的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android实现EventBus登录界面与传值(粘性事件) - Python技术站