在Android中,接口回调已经能够处理掉大部分业务需求了,实在太变态的需求就用广播也能够完成,自己写的性能好出问题也好解决。。。。。工作需要,不得不看看EventBus的用法,今天就来介绍一下学习经验。
首先就是引入这个东东,我是直接在maven上下载的jar包,下载地址:
http://search.maven.org/#search|ga|1|g%3A%22de.greenrobot%22%20AND%20a%3A%22eventbus%22
下载完成之后,拷贝到我们的项目之中就可以使用了。
使用EventBus我们首先要注册事件订阅者,这个事件订阅者就是说我们订阅的事件一会要在哪里进行处理,事件订阅者的注册和广播注册非常相似,有注册,也有解除注册,一般情况下,我们在Activity的onCreate()方法中进行注册,在Activity的onDestory()方法中解除注册。OK,代码如下:
注册:
EventBus.getDefault().register(this);
EventBus.getDefault().unregister(this);
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); }
注册号事件订阅者之后,第二步就是构造发送消息类,这个类就是我们要发送的对象,所以这个类怎么写都行,只要你把要传递的东西能够存进这个对象中又能够从这个对象中拿出来就好。OK,我写了一个简单的消息类,如下:
public class MainMessage { private String msg; public MainMessage(String msg) { this.msg = msg; } public String getMsg() { return msg; } }
下来就是发送消息,发送消息也很简单,代码如下:
EventBus.getDefault().post(new MainMessage("Hello EventBus"));就一行代码,发送了一个EventBus对象,在构造这个对象的时候,在它的构造方法中传入了一个参数,那就是Hello EventBus,如果你想要传递更多的消息内容,那么你只需要丰富这个MainMessage类就可以了。OK,那我们的消息发送到哪里去了?
最后一步,就是消息的接收,看看我们是怎么接收消息的:
//主线程中执行 @Subscribe(threadMode = ThreadMode.MainThread) public void onMainEventBus(MainMessage msg) { Log.d(TAG, "onEventBus() returned: " + Thread.currentThread()); }首先我定义了一个方法,这个方法名称我可以随意取,没有关系,这个方法有一个注解,@Subscribe,Subscribe本身的含义是订阅,有了这个注解就说明这个方法就是用来响应EventBus发送的事件的,OK,这个注册中还有一行代码,
threadMode = ThreadMode.MainThread,这个又表示什么意思呢?这个表示我们的这个方法在主线程中执行,除了在主线程中执行之外,还能在哪里执行呢?看下面三个方法://后台线程 @Subscribe(threadMode = ThreadMode.BackgroundThread) public void onBackgroundEventBus(BackgroundMessage msg) { Log.d(TAG, "onEventBusBackground() returned: " + Thread.currentThread()); } //强制后台执行 @Subscribe(threadMode = ThreadMode.Async) public void onAsyncEventBus(AsyncMessage msg) { Log.d(TAG, "onEventBusAsync() returned: " + Thread.currentThread()); } //默认情况,和发送事件在同一个线程 @Subscribe(threadMode = ThreadMode.PostThread) public void onPostEventBus(PostMessage msg) { Log.d(TAG, "onEventBusPost() returned: " + Thread.currentThread()); }
ThreadMode.BackgroundThread表示让该方法在后台执行,ThreadMode.Async也表示在后台执行,不同的是这里表示消息发送方不必等待后台线程完就可以接着往下执行。最后一个ThreadMode.PostThread表示该方法和消息发送方在同一个线程中执行。
那么针对这种不同类型的方法,我分别打印了日志,如下:
很简单吧。
好了,最后放出完整的代码,如下:
public class MainActivity extends AppCompatActivity { private TextView tv; private final static String TAG = "EventBusTest"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = ((TextView) findViewById(R.id.tv)); EventBus.getDefault().register(this); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } public void btnClick(View view) { switch (view.getId()) { case R.id.btn1: EventBus.getDefault().post(new MainMessage("Hello EventBus")); break; case R.id.btn2: EventBus.getDefault().post(new BackgroundMessage("Hello EventBus")); break; case R.id.btn3: EventBus.getDefault().post(new AsyncMessage("Hello EventBus")); break; case R.id.btn4: EventBus.getDefault().post(new PostMessage("Hello EventBus")); break; } } //主线程中执行 @Subscribe(threadMode = ThreadMode.MainThread) public void onMainEventBus(MainMessage msg) { tv.setText(msg.getMsg()); Log.d(TAG, "onEventBus() returned: " + Thread.currentThread()); } //后台线程 @Subscribe(threadMode = ThreadMode.BackgroundThread) public void onBackgroundEventBus(BackgroundMessage msg) { Log.d(TAG, "onEventBusBackground() returned: " + Thread.currentThread()); } //强制后台执行 @Subscribe(threadMode = ThreadMode.Async) public void onAsyncEventBus(AsyncMessage msg) { Log.d(TAG, "onEventBusAsync() returned: " + Thread.currentThread()); } //默认情况,和发送事件在同一个线程 @Subscribe(threadMode = ThreadMode.PostThread) public void onPostEventBus(PostMessage msg) { Log.d(TAG, "onEventBusPost() returned: " + Thread.currentThread()); } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="btnClick" android:text="发送消息到主线程执行"/> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="btnClick" android:text="发送消息到后台线程执行"/> <Button android:id="@+id/btn3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="btnClick" android:text="发送消息到后台线程强制执行"/> <Button android:id="@+id/btn4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="btnClick" android:text="发送消息--和发送方同一线程执行"/> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!"/> </LinearLayout>