1.简介
目录
4.粘性事件使用:
4.2第二个界面实现:
4.3粘性事件解注册
EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。
2.下载地址
https://github.com/ZengjxRsingstar/EventBus
-
3.基本使用案例
1)添加jar包到libs文件夹下
注册:EventBus.getDefault().register(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
解注册防止内存泄漏: EventBus.getDefault().unregister(this);
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
3.构造消息类
package com.EventBusDemo.message;
/**
* Created by zengjx on 2019/3/7.
*/
public class MessageEvent {
public String name;
public String password;
public MessageEvent(String name, String password) {
this.name = name;
this.password = password;
}
}
第1个EvenBusDemoActivity 接收消息部分:必须有 @Subsribe 描述
@Subscribe(threadMode = ThreadMode.MAIN)
public void messageEventBus(MessageEvent event){
tv_result.setText("name:"+event.name+" passwrod:"+event.password);
}
//3.订阅方法
// @Subscribe(threadMode = ThreadMode.MAIN,sticky = false,priority = 0)//sticky=false 表示无粘性 ,priority优先级越小越高
public void showData(MediaItem mediaItem) {
//发消息开始歌词同步
showLyric();
showViewData();
checkPlaymode();
setupVisualizerFxAndUi();
}
4.发布消息:
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_send:
Intent intent=new Intent(EvenBusDemoActivity.this, EventSendActivity.class);
intent.putExtra("CODEID",1);
startActivityForResult(intent,1);//跳转到第二个 发送界面
break;
}
}
第二个EventSendActivity Activity:
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_send:
//构造发送消息类
EventBus.getDefault().post(new MessageEvent("zengjx","123456"));
// finish();
break;
}
}
实验点击第二节界面的 send 按钮,跳回第一个界面会显示 数据。
粘性事件使用:
不同点在于 注册是接收时候 注册。
消息类
public class StickyEvent {
public String msg;
public StickyEvent(String msg) {
this.msg = msg;
}
}
第一个界面:实现 发送消息
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_stiky:
Intent intent1=new Intent(EvenBusDemoActivity.this, EventSendActivity.class);
intent1.putExtra("CODEID",1);
startActivityForResult(intent1,1);//
EventBus.getDefault().postSticky(new StickyEvent("我是粘性事件","1234"));
break;
}
第二个界面实现:
注册:
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_stiky:
if(!isRegister){//注意:重复注册会崩溃
isRegister=true;
EventBus.getDefault().register(EventSendActivity.this);
}
// EventBus.getDefault().register(EventSendActivity.this);
break;
/****
* Process: com.zengjx.androidbaseproject, PID: 26610
org.greenrobot.eventbus.EventBusException: Subscriber class com.EventBusDemo.EventSendActivity already registered to event class com.EventBusDemo.message.StickyEvent
at org.greenrobot.eventbus.EventBus.subscribe(EventBus.java:158)
at org.greenrobot.eventbus.EventBus.register(EventBus.java:143)
at com.EventBusDemo.EventSendActivity.onClick(EventSendActivity.java:64)
*/
}
粘性事件解注册
@Override
protected void onDestroy() {
super.onDestroy();
// EventBus.getDefault().unregister(EventSendActivity.this);
EventBus.getDefault().removeAllStickyEvents();
EventBus.getDefault().unregister(EventSendActivity.class);
}
跳转到第二个界面后点击接收粘性数据按钮此时txtView显示"我是粘性事件1234"
-
注意:重复注册会崩溃设置标志位