王学岗EventBus
2018-11-07 本文已影响0人
王学岗
第一部分
EventBus的使用步骤:
1,添加jar包/依赖
2,注册 EventBus.getDefault().register(this);
3,解注册 EventBus.getDefault().unregister(this);
防止内存泄漏
4,构造发送消息类 EventBus.getDefault().post();
5,发布消息
6,接收消息
ThreadMode.MAIN; 表示这个方法在主线程中执行
ThreadMode.POSTING 表示该方法在后台执行,不能并发处理。必须等待该线程结束后才能处理其它线程事情
ThreadMode.ASYNC; 表示该方法在后台执行,可以异步兵法处理
ThreadMode.BACKGROUND; 表示该方法和消息发送方在同一个线程中执行
我们看下我们接收消息的页面
package com.example.eventbustest;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1,注册广播
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
//2,解除注册
EventBus.getDefault().unregister(this);
}
//5,接收消息
//添加注释表示接收消息的方法,方法名字自定义,但是参数不能乱写,
@Subscribe(threadMode = ThreadMode.MAIN)
public void receiveMessage(MessageEvent messageEvent) {
Log.i("zhang_xin","接收到的消息:"+messageEvent.getMessage());
Log.i("zhang_xin","接收到消息的线程:"+Thread.currentThread().getName());
}
}
我们创建发送消息的类
package com.example.eventbustest;
//3,创建发送消息的类,名字可以随便起
public class MessageEvent {
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
private String message;
}
发送消息的代码
//4,发送消息,消息的类型必须与@Subscribe注释的方法参数类型一样
MessageEvent messageEvent=new MessageEvent();
messageEvent.setMessage("工神黄月英");
EventBus.getDefault().post(messageEvent);
startActivity(new Intent(this,MainActivity.class));
看下打印输出结果。
11-07 16:13:50.156 28451-28451/com.example.eventbustest I/zhang_xin: 接收到的消息:工神黄月英
接收到消息的线程:main
第二部分 粘性事件
使用步骤:
1,添加jar包/依赖
2,构造发送消息类
3,发布消息 EventBus.getDefault().postSticky(messageEvent);
4,接收消息
5,注册 EventBus.getDefault().register(this);
6,解注册 EventBus.getDefault().unregister(this);
防止内存泄漏
注意:粘性事件是先发送消息后注册
1,构造发送消息的类
package com.example.eventbustest;
//1,创建发送粘性消息的类,名字可以随便起
public class MessageEvent {
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
private String message;
}
2,发送粘性事件
//2,发送粘性事件
MessageEvent messageEvent=new MessageEvent();
messageEvent.setMessage("工神黄月英");
EventBus.getDefault().postSticky(messageEvent);
startActivity(new Intent(this,MainActivity.class));
后续的步骤
package com.example.eventbustest;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class MainActivity extends AppCompatActivity {
private boolean isRegister = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
protected void onDestroy() {
super.onDestroy();
//5,解除注册
EventBus.getDefault().removeAllStickyEvents();
EventBus.getDefault().unregister(this);
}
//3,接收消息
//添加注释表示接收消息的方法,方法名字自定义,但是参数不能乱写,
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void receiveMessage(MessageEvent messageEvent) {
Log.i("zhang_xin", "接收到的消息:" + messageEvent.getMessage());
Log.i("zhang_xin", "接收到消息的线程:" + Thread.currentThread().getName());
}
//按钮的点击事件
public void register(View view) {
if (isRegister) {
return;
} else {
// 4,注册粘性事件,事件注册一次即可,若连续点击连续注册就会崩溃
EventBus.getDefault().register(this);
isRegister = true;
}
}
}
我们点击按钮,有如下输出
11-07 16:31:41.956 29616-29616/com.example.eventbustest I/zhang_xin: 接收到的消息:工神黄月英
接收到消息的线程:main