EventBus的使用(基于EventBus3.0,開發(fā)必備)
來源:程序員人生 發(fā)布時間:2016-06-07 17:38:27 閱讀次數(shù):2536次
EventBus3的使用(基于EventBus3.0事件總線,開發(fā)必備)
很久沒有寫博客了,之前工作太忙了,好了,這次給大家?guī)鞟ndroid開發(fā)中使用非常普遍,非常重要的開源框架EventBus(別名:事件總線);
這是1個github上面非常出名的開源項目,地址:點擊打開鏈接查看EventBus
下面是官方介紹,這里我先截個圖,然后詳解:

上面這個圖就介紹了eventBus的大概情況,我這里大致翻1下:
EventBus是對Android發(fā)布/定閱事件總線的優(yōu)化。

這個圖非常直觀的告知了我們EventBus的原理,其實就是發(fā)布者發(fā)送1個事件,這個事件通過事件總線找到對應(yīng)的事件接受者,接受者接遭到了事件后就可以立即履行1些相應(yīng)的操作(后面會給出1個詳細(xì)使用的demo);
事件總線...
1、簡化了組件之間的通訊
1.1 將事件發(fā)布者和接受者解耦
1.2 在Activities, Fragments, and 后臺線程之間履行的非常好(也非常好用)
1.3 避免了復(fù)雜的和容易出錯的依賴性和生命周期問題
2、使你的代碼簡單(的確,非常簡單,基本就1句話弄定)
3、運行得非常快(確切)
4、非常小(jar包最多50k)
5、在app中已被使用了上億次(這么多人在使用,你還沒有用,就out了...)
6、具有先進(jìn)的功能,如交付線程,用戶優(yōu)先級等。
好了,上面簡單介紹了EventBus,那末接下來就教大家怎樣使用了
豫備工作:在你的項目中的app那個Gradle中最后面的dependencies中添加EventBus,以下:
compile 'org.greenrobot:eventbus:3.0.0'
只需要 3 步就可以完成使用:
1、定義事件:
/**
* 定義事件
*/
public class MessageEvent {
public final String message;
public MessageEvent(String message){
this.message = message;
}
}
2、準(zhǔn)備事件接受者(需要處理事件的方法)
事件接收者,Android, Activities and Fragments需要在他們的生命周期中進(jìn)行注冊和注銷事件,只有注冊了才能收到事件。范例代碼以下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注冊事件
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
//注銷事件
EventBus.getDefault().unregister(this);
super.onDestroy();
}
這樣當(dāng)這個activity處于后臺時,也能及時的更新界面上的顯示數(shù)據(jù)。
然后注冊了以后,就需要1個方法來接收事件總線上面的事件了,請注意,EventBus 3方法名可以選擇自由(沒有EventBus 2這樣的命名約定)。方法名前面還必須要有@Subscribe注釋才行,示例代碼以下:
//當(dāng)1個事件被發(fā)送出來時,這個方法將被調(diào)用(主要使用這個方法)
@Subscribe
public void onMessageEvent(MessageEvent event){
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
//當(dāng)1個其他事件被發(fā)送出來出來時,這個方法將被調(diào)用(這個方法暫時還沒有發(fā)現(xiàn)怎樣用)
@Subscribe
public void handleSomethingElse(SomeOtherEvent event){
doSomethingWith(event);
}
3、在其他activity、fragment或后臺線程發(fā)送事件,所有當(dāng)前注冊過接受者匹配事件的類型,將被接遭到,發(fā)送事件的代碼以下:
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
好了,到這里,就把EventBus3.0的基本使用方法介紹完了,那末有人可能有疑問了:怎樣沒有1個demo呢,不試1下怎樣有說服力呢?
好,接下來我就使用1個demo來介紹EventBus的使用方法;
1、首先,我使用2個activity來演示EventBus,F(xiàn)irstActivity是事件接收者,SecondActivity是事件的發(fā)送者;
定義的事件以下:
package com.chengguo.eventbus;
/**
* 定義事件
* Created by seven on 2016/5/29.
*/
public class MessageEvent {
public final String message;
public MessageEvent(String message){
this.message = message;
}
}
2、給FirstActivity注冊事件總線,并處理事件,這里就是,當(dāng)有匹配的事件時,顯示Toast 并將消息更新到TextView中。
<pre class="java" name="code">package com.chengguo.eventbus;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
public class FirstActivity extends AppCompatActivity {
private TextView mMessageText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注冊事件
EventBus.getDefault().register(this);
setContentView(R.layout.first_activity);
mMessageText = (TextView) findViewById(R.id.text_message);
findViewById(R.id.btn_next).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(FirstActivity.this,SecondActivity.class));
}
});
}
/**
* 事件接受方法
* @param event
*/
@Subscribe
public void onMessageEvent(MessageEvent event){
Toast.makeText(FirstActivity.this, event.message, Toast.LENGTH_SHORT).show();
mMessageText.setText(event.message);
}
@Override
protected void onDestroy() {
//注銷事件
EventBus.getDefault().unregister(this);
super.onDestroy();
}
}
3、SecondActivity發(fā)送消息,測試FirstActivity處于后臺時,是不是能夠接遭到消息,并處理數(shù)據(jù)。
package com.chengguo.eventbus;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import org.greenrobot.eventbus.EventBus;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
findViewById(R.id.btn_next).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post(new MessageEvent("您好!成功了!"));
}
});
}
}
測試的gif圖以下(成功了):

通過上面1個小小的測試,我們知道了怎樣使用EventBus,但是有些人就會問了,我們項目中到底有甚么好處呢?
使用處景是:當(dāng)你要設(shè)置你的昵稱或頭像時,這個時候你從設(shè)置界面回到個人中心界面時,比如個人中心要顯示你的昵稱和頭像,這個時候,如果你使用生命周期的onRestart()方法或onResume()方法來實時更新你的數(shù)據(jù),但是這樣就會使得你的app會出現(xiàn)卡頓之類的(實際開發(fā)經(jīng)驗),還有可能造成內(nèi)存泄漏之類的。這個時候使用EventBus就非常方便,而且流程度非常好。還有人說了,使用接口不1樣能夠?qū)崿F(xiàn)嗎,但是EventBus為我們節(jié)省和很多代碼,這不是很好嗎。總之,強烈建議你在你的項目中使用它,由于它真的會使你開發(fā)非常方便。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進(jìn)行捐贈