EventBus 基本使用
EventBus 是greenrobot 的一个事件通讯框架。其使用方式与Handler类似,但更加强大。
有如下特点:
- 简化了组件之间的通讯
- 将事件分为发送方和接受方
- 可以在Activity、Fragment、子线程间使用
- 避免了复杂的生命周期和依赖性问题
- 快速,专为高性能优化
- 具有交付线程,用户优先级设定等功能
- 体积小
其他特性:
- 使用注解方式(3.0)
- 可以在主线程发布接受事件
- 直接将方法交付至后台线程
- 可以在代码中任何地方使用
EventBus使用
首先将EventBus导入
compile 'org.greenrobot:eventbus:3.0.0'
首先创建一个消息的实体类,类似Message类,但可以自由指定属性以及方法:
public class Msg {
String msg;
public Msg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
注册观察者(接收者)通常在主线程的onCreate()中:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册EventBus
//EventBus可以通过`new()`方法获得或通过默认方法
EventBus.getDefault().register(this);
}
对应的取消注册
@Override
protected void onDestroy()
{
//取消注册EventBus
EventBus.getDefault().unregister(this);
super.onDestroy();
}
注解订阅方法:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(Msg msg){
//此方法运行至主线程
String msgs = msg.getMsg();
}
其中threadMode有四个值
ThreadMode.MAIN:运行在主线程ThreadMode.POSTING:在那个线程发布的就在那个线程运行ThreadMode.ASYNC:将事件运行在子线程ThreadMode.BACKGROUND:如果在UI线程发布就运行在新创建的子线程中,如果是子线程发布就运行在当前子线程。
发送消息方法:
EventBus.getDefault().post(new Msg("message"));
在注册方法执行后,EventBus将便利类中所有带有注解的方法。在发送后通过方法的参数判断具体方法并执行。
小例子: 在子线程发送在主线程更新UI
package cn.mdd.shopapp.activity;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import cn.mdd.shopapp.R;
import cn.mdd.shopapp.activity.entity.Msg;
public class CommodityClassifyActivity extends AppCompatActivity {
TextView textView;
EventBus eventBus;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_commodity_classify);
textView = (TextView) findViewById(R.id.textView2);
eventBus = new EventBus();
}
@Override
protected void onStart() {
super.onStart();
eventBus.register(this);
}
@Override
protected void onStop() {
eventBus.unregister(this);
super.onStop();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMsg(Msg msg) {
textView.setText(msg.getMsg());
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMainThread(Msg msg){
String msgs = msg.getMsg();
}
public void doClick(View view) {
new Thread(){
@Override
public void run() {
for (int i = 0;i<100;i++) {
eventBus.post(new Msg(""+i));
SystemClock.sleep(1000);
}
}
}.start();
}
}

浙公网安备 33010602011771号