EventBus3.0使用總結
來自: http://blog.csdn.net/u012702547/article/details/50688236
在Android中,接口回調已經能夠處理掉大部分業務需求了,實在太變態的需求就用廣播也能夠完成,自己寫的性能好出問題也好解決。。。。。工作需要,不得不看看EventBus的用法,今天就來介紹一下學習經驗。
首先就是引入這個東東,我是直接在maven上下載的jar包,下載地址:
http://search.maven.org/#search|ga|1|g%3A%22de.greenrobot%22%20AND%20a%3A%22eventbus%22
下載完成之后,拷貝到我們的項目之中就可以使用了。
1.注冊事件訂閱者
使用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); }
2.構造發送消息類
注冊號事件訂閱者之后,第二步就是構造發送消息類,這個類就是我們要發送的對象,所以這個類怎么寫都行,只要你把要傳遞的東西能夠存進這個對象中又能夠從這個對象中拿出來就好。OK,我寫了一個簡單的消息類,如下:
public class MainMessage { private String msg; public MainMessage(String msg) { this.msg = msg; } public String getMsg() { return msg; } }
說白了,就一個Java Bean。
3.發送消息
下來就是發送消息,發送消息也很簡單,代碼如下:
EventBus.getDefault().post(new MainMessage("Hello EventBus"));就一行代碼,發送了一個EventBus對象,在構造這個對象的時候,在它的構造方法中傳入了一個參數,那就是Hello EventBus,如果你想要傳遞更多的消息內容,那么你只需要豐富這個MainMessage類就可以了。OK,那我們的消息發送到哪里去了?
4.消息接收
最后一步,就是消息的接收,看看我們是怎么接收消息的:
//主線程中執行 @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>
就這些。
本文由用戶 qd7drei9kt 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!