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
【EventBus】Android 快速通訊框架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