EventBus的使用(基於EventBus3.0,開發必備)
EventBus3的使用(基於EventBus3.0事件匯流排,開發必備)
很久沒有寫部落格了,之前工作太忙了,好了,這次給大家帶來Android開發中使用非常普遍,非常重要的開源框架EventBus(別名:事件匯流排);
這是一個github上面非常出名的開源專案,地址:點選開啟連結檢視EventBus
下面是官方介紹,這裡我先截個圖,然後詳解:
上面這個圖就介紹了eventBus的大概情況,我這裡大致翻一下:
EventBus是對Android釋出/訂閱事件匯流排的優化。
這個圖非常直觀的告訴了我們EventBus的原理,其實就是釋出者傳送一個事件,這個事件通過事件匯流排找到對應的事件接受者,接受者接受到了事件後就能立即執行一些相應的操作(後面會給出一個詳細使用的demo);
事件匯流排...
1、簡化了元件之間的通訊
1.1 將事件釋出者和接受者解耦
1.2 在Activities, Fragments, and 後臺執行緒之間執行的非常好(也非常好用)
1.3 避免了複雜的和容易出錯的依賴性和生命週期問題
2、使你的程式碼簡單(的確,非常簡單,基本就一句話搞定)
3、執行得非常快(確實)
4、非常小(jar包最多50k)
5、在app中已經被使用了上億次(這麼多人在使用,你還沒有用,就out了...)
6、擁有先進的功能,如交付執行緒,使用者優先順序等。
好了,上面簡單介紹了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、準備事件接受者(需要處理事件的方法)
事件接收者,Android, Activities and Fragments需要在他們的生命週期中進行註冊和登出事件,只有註冊了才能收到事件。範例程式碼如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//註冊事件
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
//登出事件
EventBus.getDefault().unregister(this);
super.onDestroy();
}
這樣當這個activity處於後臺時,也能及時的更新介面上的顯示資料。然後註冊了之後,就需要一個方法來接收事件總線上面的事件了,請注意,EventBus 3方法名可以選擇自由(沒有EventBus 2這樣的命名約定)。方法名前面還必須要有@Subscribe註釋才行,示例程式碼如下:
//當一個事件被髮送出來時,這個方法將被呼叫(主要使用這個方法)
@Subscribe
public void onMessageEvent(MessageEvent event){
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
//當一個其他事件被髮送出來出來時,這個方法將被呼叫(這個方法暫時還沒有發現怎麼用)
@Subscribe
public void handleSomethingElse(SomeOtherEvent event){
doSomethingWith(event);
}
3、在其他activity、fragment或者後臺執行緒傳送事件,所有當前註冊過接受者匹配事件的型別,將被接受到,傳送事件的程式碼如下:
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
好了,到這裡,就把EventBus3.0的基本使用方法介紹完了,那麼有人可能有疑問了:怎麼沒有一個demo呢,不試一下怎麼有說服力呢?
好,接下來我就使用一個demo來介紹EventBus的使用方法;
1、首先,我使用2個activity來演示EventBus,FirstActivity是事件接收者,SecondActivity是事件的傳送者;
定義的事件如下:
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註冊事件匯流排,並處理事件,這裡就是,當有匹配的事件時,顯示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傳送訊息,測試FirstActivity處於後臺時,是否能夠接受到訊息,並處理資料。
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圖如下(成功了):
通過上面一個小小的測試,我們知道了怎樣使用EventBus,但是有些人就會問了,我們專案中到底有什麼好處呢?
使用場景是:當你要設定你的暱稱或者頭像時,這個時候你從設定介面回到個人中心介面時,比如個人中心要顯示你的暱稱和頭像,這個時候,如果你使用生命週期的onRestart()方法或者onResume()方法來實時更新你的資料,但是這樣就會使得你的app會出現卡頓之類的(實際開發經驗),還有可能造成記憶體洩漏之類的。這個時候使用EventBus就非常方便,而且流程度非常好。還有人說了,使用介面不一樣能夠實現嗎,但是EventBus為我們節省和很多程式碼,這不是很好嗎。總之,強烈建議你在你的專案中使用它,因為它真的會使你開發非常方便。