O1-開源框架使用之EventBus
零、前言
讓資料坐上bus,自由穿梭,效果如下:
通常我們可以使用Intent來實現,但通過EventBus更方便些

event_bus.gif
一、簡介:
1.引入:
implementation 'org.greenrobot:eventbus:3.1.1'
Event 事件。它可以是任意型別。 Subscriber 事件訂閱者。 Publisher 事件的釋出者。
2.EventBus3.0有四種執行緒模型:後面具體分析
POSTING (預設) 表示事件處理函式的執行緒跟釋出事件的執行緒在同一個執行緒。 MAIN 表示事件處理函式的執行緒在主執行緒(UI)執行緒,因此在這裡不能進行耗時操作。 BACKGROUND 表示事件處理函式的執行緒在後臺執行緒,因此不能進行UI操作。 如果釋出事件的執行緒是主執行緒(UI執行緒),那麼事件處理函式將會開啟一個後臺執行緒, 如果果釋出事件的執行緒是在後臺執行緒,那麼事件處理函式就使用該執行緒。 ASYNC 表示無論事件釋出的執行緒是哪一個,事件處理函式始終會新建一個子執行緒執行,同樣不能進行UI操作。
二、簡單使用
1.MainActivity
public class MainActivity extends AppCompatActivity { @BindView(R.id.textView) TextView mTextView; @BindView(R.id.id_btn_go) Button mIdBtnGo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); //1、註冊EventBus EventBus.getDefault().register(this); System.out.println(Thread.currentThread().getName()); } //3.Subscriber事件訂閱者 @Subscribe(threadMode = ThreadMode.MAIN) public void Event(Article article) { mTextView.setText("作者:" + article.getAuthor() + "\n" + "文章名字:《" + article.getName() + "》"); System.out.println(Thread.currentThread().getName()); } @Override protected void onDestroy() { super.onDestroy(); //2.登出事件 if (EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().unregister(this); } } @OnClick(R.id.id_btn_go) public void onViewClicked() { startActivity(new Intent(MainActivity.this, SecondActivity.class)); } }
SecondActivity
public class SecondActivity extends AppCompatActivity { @BindView(R.id.id_btn_back) Button mIdBtnBack; @BindView(R.id.id_et_content) EditText mIdEtContent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sencond); ButterKnife.bind(this); } @OnClick(R.id.id_btn_back) public void onViewClicked() { String txt = mIdEtContent.getText().toString(); Article toly = new Article(txt, "張風捷特烈"); //4.釋出事件 EventBus.getDefault().post(toly); System.out.println(Thread.currentThread().getName()); finish(); } }
事件實體類
public class Article { private String name; private String author; //get()、set()略。。。 }
測試1:POSTING與MAIN
SecondActivity中,新開執行緒釋出事件
new Thread() { @Override public void run() { String txt = mIdEtContent.getText().toString(); Article toly = new Article(txt, "張風捷特烈"); //4.釋出事件 EventBus.getDefault().post(toly); System.out.println(Thread.currentThread().getName()); finish(); } }.start();
POSTING:崩了
Only the original thread that created a view hierarchy can touch its views.
MAIN:正常顯示
說明使用POSTING,釋出與訂閱在同一個執行緒,也就是子執行緒,更新UI會崩
說明使用MAIN,不管釋出者在哪,訂閱者都在main執行緒,可更新UI,但不能耗時操作
測試2:BACKGROUND
在主執行緒釋出:看訂閱執行函式
結果BACKGROUND崩了,說明訂閱執行函式是新建一個執行緒中進行的
釋出:main 訂閱:pool-1-thread-1
如果在子執行緒釋出:看訂閱執行函式
則訂閱執行函式在該子執行緒(通過執行緒id檢視)
釋出:Thread-5 訂閱:Thread-5
測試3:ASYNC
在主執行緒釋出:看訂閱執行函式
I/System.out: 釋出main I/System.out: 訂閱:pool-1-thread-1
如果在子執行緒釋出:看訂閱執行函式
I/System.out: 釋出Thread-5 I/System.out: 訂閱:pool-1-thread-1
他們之間的不同應該非常明顯了吧。
後記、
1.宣告:
[1]本文由張風捷特烈原創,轉載請註明
[2]歡迎廣大程式設計愛好者共同交流
[3]個人能力有限,如有不正之處歡迎大家批評指證,必定虛心改正
[4]你的喜歡與支援將是我最大的動力
2.連線傳送門:
ofollow,noindex">更多安卓技術歡迎訪問:安卓技術棧 我的github地址:歡迎star 簡書首發,騰訊雲+社群同步更新 張風捷特烈個人網站,程式設計筆記請訪問: http://www.toly1994.com
3.聯絡我
QQ:1981462002
微信:zdl1994328
4.歡迎關注我的微信公眾號,最新精彩文章,及時送達:

公眾號.jpg