亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

EventBus使用詳解(二)——EventBus使用進階

2019-11-09 14:13:29
字體:
來源:轉載
供稿:網友

一、概述

前一篇給大家裝簡單演示了EventBus的onEventMainThread()函數的接收,其實EventBus還有另外有個不同的函數,他們分別是:

1、onEvent 2、onEventMainThread 3、onEventBackgroundThread 4、onEventAsync

這四種訂閱函數都是使用onEvent開頭的,它們的功能稍有不同,在介紹不同之前先介紹兩個概念:

告知觀察者事件發生時通過EventBus.post函數實現,這個過程叫做事件的發布,觀察者被告知事件發生叫做事件的接收,是通過下面的訂閱函數實現的。

onEvent: 如果使用onEvent作為訂閱函數,那么該事件在哪個線程發布出來的,onEvent就會在這個線程中運行,也就是說發布事件和接收事件線程在同一個線程。使用這個方法時,在onEvent方法中不能執行耗時操作,如果執行耗時操作容易導致事件分發延遲。

onEventMainThread: 如果使用onEventMainThread作為訂閱函數,那么不論事件是在哪個線程中發布出來的,onEventMainThread都會在UI線程中執行,接收事件就會在UI線程中運行,這個在Android中是非常有用的,因為在Android中只能在UI線程中跟新UI,所以在onEvnetMainThread方法中是不能執行耗時操作的。

onEventBackground: 如果使用onEventBackgrond作為訂閱函數,那么如果事件是在UI線程中發布出來的,那么onEventBackground就會在子線程中運行,如果事件本來就是子線程中發布出來的,那么onEventBackground函數直接在該子線程中執行。

onEventAsync: 使用這個函數作為訂閱函數,那么無論事件在哪個線程發布,都會創建新的子線程在執行onEventAsync.

二、實戰

1、解析

上面列出的這四個函數,關鍵問題在于,我們怎么指定調用哪個函數呢?

我們先研究一下,上一篇中是怎么調用的onEventMainThread函數,除了在接收端注冊與反注冊以后,關鍵問題在于新建的一個類:

新建一個類:

package com.harvic.other; public class FirstEvent { PRivate String mMsg; public FirstEvent(String msg) { // TODO Auto-generated constructor stub mMsg = msg; } public String getMsg(){ return mMsg; } }

發送時:

EventBus.getDefault().post(new FirstEvent("FirstEvent btn clicked"));

接收時:

發現什么問題了沒? 沒錯,發送時發送的是這個類的實例,接收時參數就是這個類實例。

所以?。。。。?!當發過來一個消息的時候,EventBus怎么知道要調哪個函數呢,就看哪個函數傳進去的參數是這個類的實例,哪個是就調哪個。那如果有兩個是呢,那兩個都會被調用?。。。?/p>

為了證明這個問題,下面寫個例子,先看下效果

2、實例

先看看我們要實現的效果:

這次我們在上一篇的基礎上,新建三個類:FirstEvent、SecondEvent、ThirdEvent,在第二個Activity中發送請求,在MainActivity中接收這三個類的實例,接收時的代碼為:

public void onEventMainThread(FirstEvent event) { Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg()); } public void onEventMainThread(SecondEvent event) { Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg()); } public void onEvent(ThirdEvent event) { Log.d("harvic", "OnEvent收到了消息:" + event.getMsg()); }

使用兩個onEventMainThread分別接收FirstEvent實例的消息和SecondEvent實例的消息,使用onEvent接收ThirdEvent實例的消息。界面操作及結果如下:

這里寫圖片描述

Log輸出結果: 這里寫圖片描述

可以看到,在發送FirstEvent時,在MainActiviy中雖然有三個函數,但只有第一個onEventMainThread函數的接收參數是FirstEvent,所以會傳到它這來接收。所以這里識別調用EventBus中四個函數中哪個函數,是通過參數中的實例來決定的。

因為我們是在上一篇例子的基礎上完成的,所以這里的代碼就不詳細寫了,只寫改動的部分。

1、三個類

package com.harvic.other; public class FirstEvent { private String mMsg; public FirstEvent(String msg) { // TODO Auto-generated constructor stub mMsg = msg; } public String getMsg(){ return mMsg; } } package com.harvic.other; public class SecondEvent{ private String mMsg; public SecondEvent(String msg) { // TODO Auto-generated constructor stub mMsg = "MainEvent:"+msg; } public String getMsg(){ return mMsg; } } package com.harvic.other; public class ThirdEvent { private String mMsg; public ThirdEvent(String msg) { // TODO Auto-generated constructor stub mMsg = msg; } public String getMsg(){ return mMsg; } }

2、發送

然后在SecondActivity中新建三個按鈕,分別發送不同的類的實例,代碼如下:

[java] view plain copy 在CODE上查看代碼片派生到我的代碼片package com.harvic.tryeventbus2; import com.harvic.other.FirstEvent; import com.harvic.other.SecondEvent; import com.harvic.other.ThirdEvent; import de.greenrobot.event.EventBus; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class SecondActivity extends Activity { private Button btn_FirstEvent, btn_SecondEvent, btn_ThirdEvent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); btn_FirstEvent = (Button) findViewById(R.id.btn_first_event); btn_SecondEvent = (Button) findViewById(R.id.btn_second_event); btn_ThirdEvent = (Button) findViewById(R.id.btn_third_event); btn_FirstEvent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub EventBus.getDefault().post( new FirstEvent("FirstEvent btn clicked")); } }); btn_SecondEvent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub EventBus.getDefault().post( new SecondEvent("SecondEvent btn clicked")); } }); btn_ThirdEvent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub EventBus.getDefault().post( new ThirdEvent("ThirdEvent btn clicked")); } }); } }

3、接收

在MainActivity中,除了注冊與注冊,我們利用onEventMainThread(FirstEvent event)來接收來自FirstEvent的消息,使用onEventMainThread(SecondEvent event)接收來自SecondEvent 實例的消息,使用onEvent(ThirdEvent event) 來接收ThirdEvent 實例的消息。

[java] view plain copy 在CODE上查看代碼片派生到我的代碼片package com.harvic.tryeventbus2; import com.harvic.other.FirstEvent; import com.harvic.other.SecondEvent; import com.harvic.other.ThirdEvent; import de.greenrobot.event.EventBus; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { Button btn; TextView tv; EventBus eventBus; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); btn = (Button) findViewById(R.id.btn_try); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(getapplicationContext(), SecondActivity.class); startActivity(intent); } }); } public void onEventMainThread(FirstEvent event) { Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg()); } public void onEventMainThread(SecondEvent event) { Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg()); } public void onEvent(ThirdEvent event) { Log.d("harvic", "OnEvent收到了消息:" + event.getMsg()); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); EventBus.getDefault().unregister(this); } }

到這里,代碼就結束 了,從上面的代碼,我們可以看到,EventBus是怎么接收消息的,是根據參數中類的實例的類型的判定的,所以當如果我們在接收時,同一個類的實例參數有兩個函數來接收會怎樣?答案是,這兩個函數都會執行,下面實驗一下: 在MainActivity中接收時,我們在接收SecondEvent時,在上面onEventMainThread基礎上另加一個onEventBackgroundThread和onEventAsync,即下面的代碼:

[java] view plain copy 在CODE上查看代碼片派生到我的代碼片//SecondEvent接收函數一 public void onEventMainThread(SecondEvent event) { Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg()); } //SecondEvent接收函數二 public void onEventBackgroundThread(SecondEvent event){ Log.d("harvic", "onEventBackground收到了消息:" + event.getMsg()); } //SecondEvent接收函數三 public void onEventAsync(SecondEvent event){ Log.d("harvic", "onEventAsync收到了消息:" + event.getMsg()); }

完整的代碼在這里:

package com.harvic.tryeventbus2; import com.harvic.other.FirstEvent; import com.harvic.other.SecondEvent; import com.harvic.other.ThirdEvent; import de.greenrobot.event.EventBus; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { Button btn; TextView tv; EventBus eventBus; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); btn = (Button) findViewById(R.id.btn_try); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(getApplicationContext(), SecondActivity.class); startActivity(intent); } }); } public void onEventMainThread(FirstEvent event) { Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg()); } //SecondEvent接收函數一 public void onEventMainThread(SecondEvent event) { Log.d("harvic", "onEventMainThread收到了消息:" + event.getMsg()); } //SecondEvent接收函數二 public void onEventBackgroundThread(SecondEvent event){ Log.d("harvic", "onEventBackground收到了消息:" + event.getMsg()); } //SecondEvent接收函數三 public void onEventAsync(SecondEvent event){ Log.d("harvic", "onEventAsync收到了消息:" + event.getMsg()); } public void onEvent(ThirdEvent event) { Log.d("harvic", "OnEvent收到了消息:" + event.getMsg()); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); EventBus.getDefault().unregister(this); } }

經過上面的分析,當發送SecondEvent實例的消息過來的時候,這三個函數會同時接收到并各自執行,所以當點擊Second Event這個button的時候,會出現下面的結果:

這里寫圖片描述

好啦,這篇就到了,講來講去就是說一個問題:消息的接收是根據參數中的類名來決定執行哪一個的;

參考文章:

《Android解耦庫EventBus的使用和源碼分析》:http://blog.csdn.net/yuanzeyao/article/details/38174537

《EventBus的使用初試》:http://blog.csdn.net/pp_hdsny/article/details/14523561

《EventBusExplained 》:https://code.google.com/p/guava-libraries/wiki/EventBusExplained

《Google Guava EventBus實例與分析》

源碼下載地址:http://download.csdn.net/detail/harvic880925/8128633

轉載自:http://blog.csdn.net/harvic880925/article/details/40787203


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产日韩视频| 91在线观看免费观看| 欧美大片在线看| 欧美最猛性xxxxx(亚洲精品)| 国产欧美最新羞羞视频在线观看| 欧美午夜影院在线视频| 亚洲欧美另类人妖| 日韩av免费看| 国产精品夫妻激情| 久久国产精品免费视频| 91精品国产电影| 黄色成人av在线| 亚洲高清久久久久久| 欧美日韩国产精品一区二区三区四区| 一区二区福利视频| 久久亚洲精品小早川怜子66| 国产日韩欧美日韩大片| 久久韩国免费视频| 欧美激情中文字幕在线| 中文字幕亚洲激情| 亚洲自拍欧美色图| 亚洲无av在线中文字幕| 久久免费国产视频| 成人午夜在线影院| 欧美日韩国产限制| 国产69久久精品成人看| 92看片淫黄大片欧美看国产片| 成人黄色在线播放| 国产精品日韩精品| 日韩在线免费高清视频| 国产免费一区视频观看免费| 久久久噜噜噜久久中文字免| 欧美极品美女视频网站在线观看免费| 成人免费直播live| 欧美激情精品在线| 国产精品久久久久77777| 欧美日韩国产成人在线| 亚洲精品一区二区在线| 在线电影欧美日韩一区二区私密| 国产在线播放不卡| 国内自拍欧美激情| 午夜精品蜜臀一区二区三区免费| zzijzzij亚洲日本成熟少妇| 欧美激情亚洲综合一区| 久久久久久久国产精品| 成人在线观看视频网站| 国产aⅴ夜夜欢一区二区三区| 日本高清久久天堂| 日韩av电影手机在线| 久久99精品国产99久久6尤物| 国产精品久久久久久久久久| 成人免费视频97| 欧美中文字幕在线| 亚洲一区精品电影| 亚洲理论在线a中文字幕| 国产精品海角社区在线观看| 亚洲一区二区三区在线免费观看| 久久精视频免费在线久久完整在线看| 97免费视频在线| 久久人人爽人人爽爽久久| 亚洲系列中文字幕| 欧美激情在线播放| 精品中文字幕在线| 欧美激情一二三| 欧美激情亚洲精品| 亚洲国产成人精品女人久久久| 色吧影院999| 国产成+人+综合+亚洲欧美丁香花| 亚洲精品日韩欧美| 国产精品wwww| 亚洲精品欧美日韩专区| 一区二区三区在线播放欧美| 亚洲在线免费观看| 亚洲自拍偷拍色片视频| 亚洲老头同性xxxxx| 欧美激情亚洲综合一区| 91欧美精品午夜性色福利在线| 国产在线观看一区二区三区| 欧美午夜精品伦理| 插插插亚洲综合网| 2019中文字幕免费视频| 成人黄色生活片| 成人激情视频免费在线| 亚洲国产精品va在线看黑人| 日韩免费黄色av| 精品国产一区二区三区在线观看| 欧美激情国产日韩精品一区18| 国产xxx69麻豆国语对白| 91免费人成网站在线观看18| 亚洲xxxx妇黄裸体| 日韩精品视频观看| 亚洲天堂影视av| 国产主播喷水一区二区| 国产日韩在线观看av| 欧美在线观看www| 久久久久久com| 亚洲欧美在线一区二区| 69精品小视频| 国产精品女主播视频| 97香蕉超级碰碰久久免费软件| 国产精品久久久久一区二区| 成人免费高清完整版在线观看| 久久久久久久电影一区| 日韩女在线观看| 性亚洲最疯狂xxxx高清| 欧美一区视频在线| 国产aⅴ夜夜欢一区二区三区| 久久影视三级福利片| 欧洲成人性视频| 国产精品自产拍在线观看中文| 2020久久国产精品| 亚洲国产日韩欧美在线99| 亚洲大胆人体av| 国内外成人免费激情在线视频| 96精品久久久久中文字幕| 精品国产视频在线| 久精品免费视频| 欧美一区二三区| 欧美日韩性生活视频| 亚洲国产精品视频在线观看| 精品国产91乱高清在线观看| 日韩av最新在线观看| 久久精品国产精品亚洲| 欧美另类老女人| 国产97在线视频| 欧美性黄网官网| 萌白酱国产一区二区| 欧美亚洲国产精品| 热99在线视频| 久久影视免费观看| 久久久久久久久久久av| 91精品中国老女人| 亚洲精品欧美日韩| 亚洲精品一区久久久久久| 91精品久久久久久久久久久久久| 在线精品视频视频中文字幕| 国产精品福利小视频| 亚洲第一免费播放区| 久久免费高清视频| 日韩电影第一页| 国产精品18久久久久久首页狼| 日本成人黄色片| 96国产粉嫩美女| 国产精品久久久久久久久免费| 日韩av免费观影| 国模精品视频一区二区三区| 久久亚洲一区二区三区四区五区高| 麻豆乱码国产一区二区三区| 亚洲自拍小视频| 综合国产在线观看| 国产成人精品电影久久久| 国产精品对白刺激| 欧美放荡办公室videos4k| 日韩欧美国产中文字幕| 国产精品精品一区二区三区午夜版| 欧美视频在线观看免费网址| 欧美精品久久久久久久久久| 国产精品免费福利| 日本乱人伦a精品| 亚洲精品中文字幕av| 91久久久亚洲精品| 日韩中文字幕视频在线观看| 国产丝袜精品视频| 国产精品毛片a∨一区二区三区|国|