开门见山,EventBus框架主要是解耦的作用。它是Android优化发布和订阅事件总线。很好的解决了Intent,Handler以及广播在Activity,Fragment,Service以及线程之间的通信的复杂性。
集成很简单:
1.添加依赖:(AS3.0以上)
implementation 'org.greenrobot:eventbus:3.0.0'
2.添加代码:
public class MainActivity extends AppCompatActivity { private Button mButton; private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button) findViewById(R.id.main); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, OneActivity.class); startActivity(intent); } }); mTextView = (TextView) findViewById(R.id.text_one); } @Override protected void onStart() { super.onStart(); try { //注册 EventBus.getDefault().register(this); } catch (Exception e) { e.printStackTrace(); } } @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(EventBusFrist event) { String msg = "收到消息" + event.getMsg(); Log.e("msg",msg); mTextView.setText(msg); } @Override protected void onDestroy() { super.onDestroy(); //反注册 EventBus.getDefault().unregister(this); } }
在第二个Activity里面
public class OneActivity extends AppCompatActivity { private Button mButton; private TextView mTextEvent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_one); mButton = (Button) findViewById(R.id.btn_event); mTextEvent = (TextView) findViewById(R.id.text_event); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //这里是发送 EventBus.getDefault().post(new EventBusFrist("发送消息")); } }); } }
写一个消息的类
public class EventBusFrist { private String mMsg; public EventBusFrist(String msg) { mMsg = msg; } public String getMsg() { return mMsg; } }注意的是:在EventBus3.0中在MainActivity中
onEventMainThread 是需要在头部添加
@Subscribe(threadMode = ThreadMode.MAIN)
在3.0之前是不需要添加的。在代码规范上是在
onStart()
里面注册。
EventBus的事件的优先级:
/** * 事件的优先级 * 订阅者方法的事件传递优先级 数值越大优先级越高 3>2>1 */ @Subscribe(threadMode = ThreadMode.POSTING, priority = 1) public void onMessageEvent1(MessageEvent event) { Log.e("MainActivity", "onMessageEvent1, message is " + event.getMessage()); } @Subscribe(threadMode = ThreadMode.POSTING, priority = 2) public void onMessageEvent2(MessageEvent event) { Log.e("MainActivity", "onMessageEvent2, message is " + event.getMessage()); /** * 取消事件 * 高优先级的订阅者方法接收到事件之后取消事件的传递。此时,低优先级的订阅者方法将不会接收到该事件 * 此时 onMessageEvent1就接接受不到 */ EventBus.getDefault().cancelEventDelivery(event); } @Subscribe(threadMode = ThreadMode.POSTING, priority = 3) public void onMessageEvent3(MessageEvent event) { Log.e("MainActivity", "onMessageEvent3, message is " + event.getMessage()); }
Eventbus的粘性事件:
发送粘性事件:
EventBus.getDefault().postSticky(new MessageEvent("EventBus 粘性事件!"));
接受粘性事件:
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void onMessageEvent(MessageEvent event) { Log.i("ThreeActivity", "message is " + event.getMessage()); // 更新界面 // 移除粘性事件 EventBus.getDefault().removeStickyEvent(event); /** * 根据需求来确定 */ // 移除指定的粘性事件 // EventBus.getDefault().removeStickyEvent(Object event); // 移除指定类型的粘性事件 // EventBus.getDefault().removeStickyEvent(Class<T> eventType); // 移除所有的粘性事件 // EventBus.getDefault().removeAllStickyEvents(); }
相对的EventBus是比较灵活的,不局限在Intent,Content,BroadcastReceiver.使用更加方便。内存的开销也很小,很大程度上优化了性能。
有兴趣的可以了解一下post 和postSticky 的发送的区别
github Dome地址:点击打开链接
此文章紧紧是为了学习所写。如有侵权@我,必定删除。
希望自己能够提高,也能帮助一些需要的人。