- 什麼是EventBus
EventBus是Android下高效的釋出/訂閱事件總線機制。作用是可以代替傳統的Intent,Handler,Broadcast或接口函數在Fragment,Activity,Service,線程之間傳遞資料,執行方法。特點是代碼簡潔,是一種釋出訂閱設計模式(Publish/Subsribe),或稱作觀察者設計模式。
- 下載下傳EventBus
1. 下載下傳EventBus庫:
庫位址:https://github.com/greenrobot/EventBus/releases
源碼位址:https://github.com/greenrobot/EventBus
2. 将下載下傳好的EventBus-2.4.0.jar放入libs即可
- 如何使用EventBus
1. 定義事件, 定義一個類,繼承預設的Object即可,用于區分事件和傳輸資料。 本例為 MsgEvent1和 MsgEvent2
2. 添加訂閱者:EventBus.getDefault().register(this); 将所在類作為訂閱者,架構會通過反射機制擷取所有方法及其參數。
訂閱者所在類可以定義以下一個或多個方法用以接收事件:
public void onEvent(MsgEvent1 msg)
public void onEventMainThread(MsgEvent1 msg)
public void onEventBackgroundThread(MsgEvent1 msg)
public void onEventAsync(MsgEvent1 msg)
3. 釋出者釋出事件:EventBus.getDefault().post(new MsgEvent1("主線程發的消息1"));
一旦執行了此方法, 所有訂閱者都會執行第二步定義的方法。
4. 取消訂閱:EventBus.getDefault().unregister(this); 當訂閱者不再被使用,或者被關閉時,最好進行取消訂閱,不再接受事件消息。
5. 注意事項:釋出者post方法參數是Object類型,也就是可以釋出任何事件。訂閱者接受消息時,隻要定義的是第二步四個方法任意一個,并且參數和釋出者釋出的一緻,即可被執行。釋出者也可以通過第二步接收消息,訂閱者也可以作為釋出者發消息給自己。
- 代碼實作 (本例是兩個Fragment互動, 也可以是Service,Activity,Fragment以及任意類之間互動)
- 點選左邊面闆的條目, 可以發送事件,右面闆(另一個Fragment)接收到事件,顯示界面,列印日志。
- 代碼下載下傳 http://yunpan.cn/cctFTVuWtyIgK 通路密碼 66ed
- 界面如下
-
EventBus--事件總線
1.主界面搭建:
java
- public class MainActivity extends FragmentActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- }
複制代碼 xml
- <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:divider="?android:attr/dividerHorizontal"
- android:orientation="horizontal"
- android:showDividers="middle"
- android:baselineAligned="false"
- tools:context="com.itheima.eventbusdemo.MainActivity" >
- <fragment
- android:id="@+id/left_fragment"
- android:name="com.itheima.eventbusdemo.LeftFragment"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:layout_weight="1" />
- <fragment
- android:id="@+id/right_fragment"
- android:name="com.itheima.eventbusdemo.RightFragment"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:layout_weight="3" />
- </LinearLayout>
複制代碼
2. 定一個事件類MsgEvent1 (MsgEvent2與此一緻):
- public class MsgEvent1 {
- private String msg;
- public MsgEvent1(String msg) {
- super();
- this.msg = msg;
- }
- public String getMsg() {
- return msg;
- }
- }
複制代碼
3. 将右面闆作為訂閱者, 執行方法并接收資料:
- public class RightFragment extends Fragment {
- private TextView tv;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 界面建立時,訂閱事件, 接受消息
- EventBus.getDefault().register(this);
- }
- @Override
- public void onDestroy() {
- super.onDestroy();
- // 界面銷毀時,取消訂閱
- EventBus.getDefault().unregister(this);
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // 布局隻有一個TextView,不再貼代碼
- View view = inflater.inflate(R.layout.fragment_right, null);
- tv = (TextView) view.findViewById(R.id.tv);
- return view;
- }
- public void onEvent(MsgEvent1 msg){
- String content = msg.getMsg()
- + "\n ThreadName: " + Thread.currentThread().getName()
- + "\n ThreadId: " + Thread.currentThread().getId();
- System.out.println("onEvent(MsgEvent1 msg)收到" + content);
- }
- public void onEventMainThread(MsgEvent1 msg){
- String content = msg.getMsg()
- + "\n ThreadName: " + Thread.currentThread().getName()
- + "\n ThreadId: " + Thread.currentThread().getId();
- System.out.println("onEventMainThread(MsgEvent1 msg)收到" + content);
- tv.setText(content);
- }
- public void onEventBackgroundThread(MsgEvent1 msg){
- String content = msg.getMsg()
- + "\n ThreadName: " + Thread.currentThread().getName()
- + "\n ThreadId: " + Thread.currentThread().getId();
- System.out.println("onEventBackgroundThread(MsgEvent1 msg)收到" + content);
- }
- public void onEventAsync(MsgEvent1 msg){
- String content = msg.getMsg()
- + "\n ThreadName: " + Thread.currentThread().getName()
- + "\n ThreadId: " + Thread.currentThread().getId();
- System.out.println("onEventAsync(MsgEvent1 msg)收到" + content);
- }
- public void onEvent(MsgEvent2 msg){
- String content = msg.getMsg()
- + "\n ThreadName: " + Thread.currentThread().getName()
- + "\n ThreadId: " + Thread.currentThread().getId();
- System.out.println("onEvent(MsgEvent2 msg)收到" + content);
- tv.setText(content);
- }
- }
複制代碼
4. 在左面闆釋出消息。(任意類都可以釋出消息)
- public class LeftFragment extends ListFragment {
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- String[] strs = new String[]{"主線程消息1", "子線程消息1", "主線程消息2"};
- setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, strs));
- }
- @Override
- public void onListItemClick(ListView l, View v, int position, long id) {
- switch (position) {
- case 0:
- // 主線程
- System.out.println(
- "----------------------主線程發的消息1"
- + " threadName: "+ Thread.currentThread().getName()
- + " threadId: " + Thread.currentThread().getId());
- EventBus.getDefault().post(new MsgEvent1("主線程發的消息1"));
- break;
- case 1:
- // 子線程
- new Thread(){
- public void run() {
- System.out.println(
- "----------------------子線程發的消息1"
- + " threadName: "+ Thread.currentThread().getName()
- + " threadId: " + Thread.currentThread().getId());
- EventBus.getDefault().post(new MsgEvent1("子線程發的消息1"));
- };
- }.start();
- break;
- case 2:
- // 主線程
- System.out.println(
- "----------------------主線程發的消息2"
- + " threadName: "+ Thread.currentThread().getName()
- + " threadId: " + Thread.currentThread().getId());
- EventBus.getDefault().post(new MsgEvent2("主線程發的消息2"));
- break;
- }
- }
- }
複制代碼
分别點選左邊條目, Log輸出分析
源碼網盤位址:
http://yunpan.cn/cctFTVuWtyIgK 通路密碼 66ed
EventBus架構原理流程圖
1. Publisher是釋出者, 通過post()方法将消息事件Event釋出到事件總線
2. EventBus是事件總線, 周遊所有已經注冊事件的訂閱者們,找到裡邊的onEvent等4個方法,分發Event
3. Subscriber是訂閱者, 收到事件總線發下來的消息。即onEvent方法被執行。注意參數類型必須和釋出者釋出的參數一緻
轉載自:http://bbs.itcast.cn/thread-83609-1-1.html