1. 程式人生 > >EventBus的使用(基於EventBus3.0,開發必備)

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為我們節省和很多程式碼,這不是很好嗎。總之,強烈建議你在你的專案中使用它,因為它真的會使你開發非常方便。