-
onEventMainThread: 事件的处理会在UI线程中执行。事件处理时间不能太长,长了会出现臭名远之的ANR。
-
onEventBackgroundThread:事件的处理会在一个后台线程中执行。虽然名字是BackgroundThread,事件处理是在后台线程,但事件处理时间还是不应该太长,因为如果发送事件的线程是后台线程,会直接在当前后台线程执行事件;如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。
-
onEventAsync:事件处理会在单独的线程中执行,主要用于在后台线程中执行耗时操作,每个事件会开启一个线程,但最好限制线程的数目。
下面还是先上代码再总结分析。
实战一把屌爆天的功能
如下示例演示了EventBus的线程间通信与线程内通信及自定义消息结构的通信。
如下是主界面显示效果:
接着看代码:
首先自定义一个消息数据类型,如下:
public class MsgBean {
private String msg;
public MsgBean(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
接着编写主界面及逻辑代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mShowInfo1, mShowInfo2, mShowInfo21, mShowInfo22;
private Button mBtn1, mBtn2, mBtn21, mBtn22;
private int mCount = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
}
private void initData() {
mShowInfo1 = (TextView) findViewById(R.id.first_show);
mBtn1 = (Button) findViewById(R.id.get_btn_1);
mBtn1.setOnClickListener(this);
mShowInfo2 = (TextView) findViewById(R.id.second_show);
mBtn2 = (Button) findViewById(R.id.get_btn_2);
mBtn2.setOnClickListener(this);
mShowInfo21 = (TextView) findViewById(R.id.first_show_lin2);
mBtn21 = (Button) findViewById(R.id.get_btn_1_line2);
mBtn21.setOnClickListener(this);
mShowInfo22 = (TextView) findViewById(R.id.second_show_line2);
mBtn22 = (Button) findViewById(R.id.get_btn_2_line2);
mBtn22.setOnClickListener(this);
}
@Override
protected void onStart() {
super.onStart();
//注册EventBus
EventBus.getDefault().register(this);
}
@Override
protected void onStop() {
super.onStop();
//取消EventBus
EventBus.getDefault().unregister(this);
}
//事件1接收者:在主线程接收
public void onEvent(String event){
mShowInfo1.setText(event);
}
//事件2接收者:在主线程接收自定义MsgBean消息
public void onEvent(MsgBean event){
mShowInfo21.setText(event.getMsg());
}
//事件3接收者:在主线程接收
public void onEventMainThread(Integer event) {
mShowInfo2.setText(event+“”);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.get_btn_1:
//事件1发送者:在主线程发送
EventBus.getDefault().post(“test!”);
break;
case R.id.get_btn_1_line2:
//事件2发送者:在主线程发送自定义MsgBean消息
EventBus.getDefault().post(new MsgBean(“type”));
break;
case R.id.get_btn_2:
//事件3发送者:在子线程循环发送
new Timer().schedule(new TimerTask() {
@Override
public void run() {