1. 程式人生 > >Android開源通訊框架之——EventBus

Android開源通訊框架之——EventBus

前陣子看了 Mr Simple的部落格,關於事件匯流排的,自己也跟著學了下

一、什麼是EventBus

EventBus是一種基於事件釋出與訂閱模式的事件匯流排,實現了Activity、Fragment、Service元件或物件之間互動。讓釋出與訂閱充分的解耦。

二、與Android其他事件傳遞的區別

Android傳遞方式包括Handler、BroadcastReceiver、Interface回撥方式相比,它不需要像Handler一樣通過回撥進行通訊,還需要考慮是否需要在子執行緒操作等問題。

三、流程圖

註冊接受者的簡單流程圖

釋出事件的簡單流程圖

通俗的說:

訂閱事件

1、在我們OnCreate的時候EventBus.getDefault().register(this)註冊事件匯流排,EventBus會遍歷當前

物件的所有方法把所有的OnEvent方法記錄下來,以Map的方式記錄下來,其中key為OnEvent的引數型別,即傳遞的物件,value為OnEvent的方法。OnCreate執行完成後OnEventMainThread方法就以鍵值的形式存放在EventBus裡面。

釋出事件

2、呼叫EventBus.getDefault().post(傳遞的物件),EventBus會根據傳遞的物件實參去查詢匯流排Map裡面對應的方法,找到了我們的onEventMainThread,最終呼叫反射去執行我們的方法。

四、以實時監控網路狀態為例子

Activity註冊事件匯流排

public class EventNetWorkActivity extends Activity {

	private TextView mNetworkState;
	NetWorkBroadCactReceiver receiver = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_network);
		mNetworkState = (TextView) findViewById(R.id.id_network_state);
		registerBroadcastReceiver();
		EventBus.getDefault().register(this);

	}

	// 這裡的引數必須要是Event,跟post的對應一致
	public void onEventMainThread(NetEvent event) {
		Log.i("網路狀態onEventMainThread", "" + event.getConnectResult());
		if (event.getConnectResult()) {
			mNetworkState.setVisibility(View.GONE);
		} else {
			mNetworkState.setVisibility(View.VISIBLE);
		}
	}

	public void registerBroadcastReceiver() {
		IntentFilter intentfilter = new IntentFilter();
		intentfilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
		receiver = new NetWorkBroadCactReceiver();
		registerReceiver(receiver, intentfilter);

	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		EventBus.getDefault().unregister(this);
		unregisterReceiver(receiver);
		super.onDestroy();
	}

}

注意:onEventMainThread裡面的引數必須要是自定義的EventType,就是傳遞的物件,否則系統找不到該方法不會執行。

public class NetWorkBroadCactReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {
			boolean isConnected = NetUtils.isNetworkConnected(context);
			System.out.println("網路狀態:" + isConnected);
			System.out.println("wifi狀態:" + NetUtils.isWifiConnected(context));
			System.out.println("行動網路狀態:" + NetUtils.isMobileConnected(context));
			System.out.println("網路連線型別:" + NetUtils.getConnectedType(context));
			if (isConnected) {
				Log.i("提交", isConnected+"");
				<span style="color:#ff0000;">EventBus.getDefault().post(new NetEvent(true));</span>
			} else {
				<span style="color:#ff0000;">EventBus.getDefault().post(new NetEvent(false));</span>
			}
		}

	}


五、訂閱事件的四種方法

1、OnEvent :該事件在哪個執行緒發出,OnEvent就在那個執行緒執行,即釋出事件和接收事件都在同一個執行緒,使用這個方法OnEvent不能執行耗時的任務,否則會阻塞主執行緒

2、OnEventMainThread:無論事件在那個執行緒釋出,OnEventMainThread都在UI執行緒執行執行,接收執行緒就在UI執行緒執行,更新UI是在主執行緒,當然也不能執行耗時任務

3、OnEventMainThread:無論事件在那個執行緒釋出,OnEventMainThread都在UI執行緒執行執行,接收執行緒就在UI執行緒執行,更新UI是在主執行緒,當然也不能執行耗時任務

4、onEventBackground:如果使用onEventBackgrond作為訂閱函式,那麼如果事件是在UI執行緒中釋出出來的,那麼onEventBackground就會在子執行緒中執行,如果事件本來就是子執行緒中釋出出來的,那麼onEventBackground函式直接在該子執行緒中執行。

5、onEventAsync:使用這個函式作為訂閱函式,非同步訂閱,無論事件在哪個執行緒釋出,都會建立新的子執行緒在執行onEventAsync.

public void onEvent(Object object)

{
Log.e("hongliang","onEvent");
}

本類釋出本類訂閱

public class ItemListFragment extends ListFragment {

	@Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        // Register  
        EventBus.getDefault().register(this);  
    }  
  
    @Override  
    public void onDestroy()  
    {  
        super.onDestroy();  
        // Unregister  
       </span> EventBus.getDefault().unregister(this);<span style="color:#ff0000;">  
    }  
  
    @Override  
    public void onViewCreated(View view, Bundle savedInstanceState)  
    {  
        super.onViewCreated(view, savedInstanceState);  
        // 開啟執行緒載入列表  
        new Thread()  
        {  
            public void run()  
            {  
                try  
                {  
                    Thread.sleep(2000); // 模擬延時  
                    // 釋出事件,在後臺執行緒發的事件  
                    EventBus.getDefault().post(new ItemListEvent(Item.ITEMS));  
                } catch (InterruptedException e)  
                {  
                    e.printStackTrace();  
                }  
            };  
        }.start();  
    }  
  
    public void onEventMainThread(ItemListEvent event)  
    {  
        </span>setListAdapter(new ArrayAdapter<Item>(getActivity(),  
                android.R.layout.simple_list_item_activated_1,  
                android.R.id.text1, event.getItems())); <span style="color:#ff0000;"> 
    }  
  
    @Override  
    public void onListItemClick(ListView listView, View view, int position,  
            long id)  
    {  
        super.onListItemClick(listView, view, position, id);  
        EventBus.getDefault().post(getListView().getItemAtPosition(position));  
    }  

}

相關推薦

Android開源通訊框架——EventBus

前陣子看了 Mr Simple的部落格,關於事件匯流排的,自己也跟著學了下 一、什麼是EventBus EventBus是一種基於事件釋出與訂閱模式的事件匯流排,實現了Activity、Fragment、Service元件或物件之間互動。讓釋出與訂閱充分的解耦。

快速Android開發系列通訊EventBus

先吐槽一下部落格園的MarkDown編輯器,推出的時候還很高興部落格園支援MarkDown了,試用了下發現支援不完善就沒用了,這次這篇是在其他編輯器下寫的,複製過來後發現。。太爛了。怎麼著作為一個技術部落格社群,對程式碼的支援應該完善一下吧,`行內程式碼塊`不支援就算了,程式碼段內還不能有空行,一有空行就識別

Android框架EventBus的使用

EventBus是由greenrobot 組織貢獻的一個Android事件釋出/訂閱輕量級框架。 EventBus是一個Android端優化的publish/subscribe訊息匯流排,簡化了應用程式內各元件間、元件與後臺執行緒間的通訊。比如請求網路,等網路返回時通過Handler或Broad

Android 谷歌 開源 通訊框架 VOLLEY(六)——應用例項

五、應用例項 package com.example.test; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.vo

Android 谷歌 開源 通訊框架 VOLLEY(一)

  HTTP 是應用層協議,TCP 是傳輸層協議(位於應用層之下)。   一般來說,移動應用推薦使用 HTTP 協議,有很多優點:   1. HTTP 發展成熟   HTTP 幾乎已經快成為一種通用的 Web 標準,Web Services、Open AP

EventBusAndroid 快速通訊框架EventBus

概述及基本概念 **EventBus**是一個Android端優化的publish/subscribe訊息匯流排,簡化了應用程式內各元件間、元件與後臺執行緒間的通訊。比如請求網路,等網路返回時通過Handler或Broadcast通知UI,兩個Fragment之間需要

Android 視訊播放框架TigerVideoPlayer

github專案地址:https://github.com/huyongli/TigerVideo TigerVideoPlayer 該Library實現了Android中的視訊播放模組,視訊播放控制與介面顯示充分解耦,可自定義自己喜歡的核心播放器來實現播放功能(MediaPlayer,Ex

Android的Okhttp框架post、get用法講解(落雨敏)

         前言:okhttp作為Android主流網路框架之一,但在近日okhttp網路請求卻比較火,主要原因是在谷歌官方在6.0以後在Android sdk已經移除了httpClient,加入我們okHttp。在常用的框架之中( vol

Android 網路通訊框架Volley簡介(Google IO 2013)

1. 什麼是Volley在這之前,我們在程式中需要和網路通訊的時候,大體使用的東西莫過於AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Google I/O 2013上,Volley釋出了。

Android開源播放框架vitamio的介紹

Android開源播放框架Vitamio的介紹 Vitamio 是一款 Android 與 iOS 平臺上的全能多媒體開發框架,全面支援硬體解碼與 GPU 渲染。Vitamio能夠流暢播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,R

Android 網路通訊框架Volley完全解析(一)

Volley簡介及Request基本用法  Google I/O 2013上,Volley釋出了。Volley是Android平臺上的網路通訊庫,能使網路通訊更快,更簡單,更健壯。這是Volley名

Android 開源網路框架Android-Async-Http、Volley、OkHttp3、Retrofit2.0)對比

思維導圖 一、為什麼要使用網路開源框架 1. Android系統自帶網路請求 Android系統自帶的網路請求模組有兩個,一個是HttpClient,另一個是HttpUrlConnection。 1.1. HttpUrlConnection HttpURLCon

Android開源專案推薦「最好用的Log」

1  Android Log             今天在微信公眾號,看到了張神的推文,受益不少,所以把他分享到這裡,若要看原文,可以到該網站: http://mp.weixin.qq.com/s?__biz=MzA4NTQwNDcyMA==&mid=26

【XMPP協議】開發Android即時通訊APP瞭解XMPP(一)

目前正在忙公司專案,製作基於XMPP的即時通訊APP,為此必須先了解下XMPP協議,所以寫篇部落格加深下印象。 關於XMPP協議的相關介紹: XMPP(Extensible Messageing and Presence Protocol:可擴充套件訊息與存

WMRouter:美團外賣Android開源路由框架

WMRouter是一款Android路由框架,基於元件化的設計思路,功能靈活,使用也比較簡單。 WMRouter最初用於解決美團外賣C端App在業務演進過程中的實際問題,之後逐步推廣到了美團其他App,因此我們決定將其開源,希望更多技術同行一起開發,應用到更廣泛的場

Android開源網路框架Retrofit(入門篇)

Restful風格介面基本成了業界主流,Retrofit框架也大火特火,最近專案中也決定更新換代,採用Retrofit。本著學習之餘,也對接下來的學習者有一些幫助,於是寫了本文,主要的內容是對官網內容的一個翻譯和補充解釋。 plus:本文假設你對於基

Android開源專案實踐UI篇-李忠義-專題視訊課程

Android開源專案實踐之UI篇—18365人已學習 課程介紹        本課程主要展現瞭如何利用Android開原始碼進行app的開發。例如: 1.非同步網路請求(android-async-http); 2.百變圓形滾動條(ProgressWheel);3.滑動導航

Android網路通訊框架Volley

比如,螢幕旋轉的時候,有時候會導致再次從網路取得資料。為了避免這種不必要的網路訪問,我們可能需要自己寫很多針對各種情況的處理,比如cache什麼的。   再有,比如ListView的時候,我們滾動過快,可能導致有些網路

Android 通訊EventBus實現廣播與Activity通訊

本章節講述 如何利用EventBus 實現Android廣播與Activity通訊  根據廣播接收到的內容更新Activity資料本章節中的廣播是極光推送操作別名和標籤的廣播程式碼1:@Override

Android 資料庫ORM開源框架greenDAO

我相信,在平時的開發過程中,大家一定會或多或少地接觸到 SQLite。然而在使用它時,我們往往需要做許多額外的工作,像編寫 SQL 語句與解析查詢結果等。所以,適用於 Android 的ORM 框架也就孕育而生了,現在市面上主流的框架有 OrmLite、Suga