EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
https://github.com/greenrobot/EventBus
EventBus主要角色:
Event 传递的事件对象
Subscriber 事件的订阅者
Publisher 事件的发布者
定义一个事件类型
NAIN UI主线程
BACKGROUND 后台线程
POSTING 和发布者处在同一个线程
ASYNC 异步线程
方法名为:onEventPostThread, onEventMainThread,onEventBackgroundThread,onEventAsync即可具体什么区别呢?
onEventMainThread代表这个方法会在UI线程执行
onEventPostThread代表这个方法会在当前发布事件的线程执行
BackgroundThread这个方法,如果在非UI线程发布的事件,则直接执行,和发布在同一个线程中。如果在UI线程发布的事件,则加入后台任务队列,使用线程池一个接一个调用。
Async 加入后台任务队列,使用线程池调用,注意没有BackgroundThread中的一个接一个。
MainActivity中注册和取消订阅事件
创建了SecondActivity用来发布消息
https://github.com/greenrobot/EventBus
EventBus主要角色:
Event 传递的事件对象
Subscriber 事件的订阅者
Publisher 事件的发布者
ThreadMode 定义函数在何种线程中执行
添加引用
compile 'org.greenrobot:eventbus:3.0.0'
定义一个事件类型
package com.fate.eventbus;
public class MessageEvent {
private String message;
public MessageEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
EventBus包含4个ThreadMode:PostThread,MainThread,BackgroundThread,Async
NAIN UI主线程
BACKGROUND 后台线程
POSTING 和发布者处在同一个线程
ASYNC 异步线程
方法名为:onEventPostThread, onEventMainThread,onEventBackgroundThread,onEventAsync即可具体什么区别呢?
onEventMainThread代表这个方法会在UI线程执行
onEventPostThread代表这个方法会在当前发布事件的线程执行
BackgroundThread这个方法,如果在非UI线程发布的事件,则直接执行,和发布在同一个线程中。如果在UI线程发布的事件,则加入后台任务队列,使用线程池一个接一个调用。
Async 加入后台任务队列,使用线程池调用,注意没有BackgroundThread中的一个接一个。
MainActivity中注册和取消订阅事件
package com.fate.eventbus;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button firstBtn;
private TextView firstTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firstBtn = (Button) findViewById(R.id.first_button);
firstTv = (TextView) findViewById(R.id.first_textview);
firstBtn.setOnClickListener(this);
if(!EventBus.getDefault().isRegistered(this)){
//在需要订阅事件的地方注册事件
EventBus.getDefault().register(this);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (EventBus.getDefault().isRegistered(this)){
//取消事件订阅
EventBus.getDefault().unregister(this);
}
}
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,SecondActivity.class);
startActivity(i);
}
//处理事件
@Subscribe(threadMode = ThreadMode.MAIN)//在ui线程执行
public void onMoonEvent(MessageEvent messageEvent){
firstTv.setText(messageEvent.getMessage());
}
}
创建了SecondActivity用来发布消息
package com.fate.eventbus;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import org.greenrobot.eventbus.EventBus;
public class SecondActivity extends AppCompatActivity implements View.OnClickListener{
private Button secondBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
secondBtn = (Button) findViewById(R.id.second_button);
secondBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//去发布一个事件
EventBus.getDefault().post(new MessageEvent("this is fate second page"));
finish();
}
}
相关文章
http://blog.csdn.net/lmj623565791/article/details/40920453
http://www.cnblogs.com/whoislcj/p/5595714.html
http://blog.csdn.net/itachi85/article/details/52205464