EventBus

2018-12-25  本文已影响0人  CQ_TYL
常用事件消息传递
集成
 compile 'org.greenrobot:eventbus:3.1.1'

EventBus是一款针对Anddoid优化的发布/订阅事件总线。主要是替代intent,Handler,
BroadCast在Fragment,activity,service线程之间传递消息。
优点:开销小,代码更优雅,以及将发送者和节后这解耦

基本用法
EventBus.getDefault.register(this);
EventBus.getDefault.register(this,methodName,Event.class);
EventBus.getDefault.unregister(this);
onEventMainThread onEvent
onEventPostThread onEventAsync
onEventBackgroundThread
  EventBus.getDefault().post(new Event(msg));
简单的demo
public class MainActivity extends AppCompatActivity {
//第一个界面
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);//注册
        findViewById(R.id.bn_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,SecondActivity.class));
            }
        });
    }
    @Subscribe(threadMode = ThreadMode.MAIN)//需要加上注解
    public void  onEventMainThred(MyEvent event){
       Log.e("tyl","masg="+event.getEvent());

   }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);//注销
    }
}
//第二个界面
public class SecondActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.bn_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MyEvent myEvent = new MyEvent();
                myEvent.setEvent("hello");
                EventBus.getDefault().post(myEvent);
                finish();
            }
        });
    }
}
//消息源
public class MyEvent {
    private String event;

    public String getEvent() {
        return event;
    }

    public void setEvent(String event) {
        this.event = event;
    }
}

ThreadMode分类

在EventBus中,您可以使用四个ThreadModes中的一个来定义将调用事件处理方法的线程。

//在同一个线程中调用(默认)
// ThreadMode在这里是可选的
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessageEvent(MessageEvent event) {
    textView.setText(event.message);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
    textView.setText(event.message);
}
//在Android UI主线程中调用
@Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
public void onMessageEvent(MessageEvent event) {
    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
    textView.setText(event.message);
}
//在后台线程中调用
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
    saveToDisk(event.message);
}
//在一个单线程中调用
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
    backend.send(event.message);
}
总结

我们根据EventBus中的不同ThreadMode的方式来进行对我们项目的使用,在什么情况中使用哪种线程将是我们所需要考虑的。
根据Android 中的线程不同,来使用不同的EventBus的不同线程。

上一篇下一篇

猜你喜欢

热点阅读