1. 程式人生 > >Eventbus 詳解,Activity和fragment通訊,相互發送接收資料

Eventbus 詳解,Activity和fragment通訊,相互發送接收資料

最近,需要做fragment與activity的互動,但是,又不想使用回撥介面,所以想到了EventBus.
大致瞭解了一下其主要介紹為:
一款針對Android優化的釋出/訂閱事件匯流排。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,執行緒之間傳遞訊息.優點是開銷小,程式碼更優雅。以及將傳送者和接收者解耦。

言歸正傳,在程式中,Fragment與Activity互動無非已下幾種:
這裡寫圖片描述

其實,EventBus使用起來十分簡單,大體為已下幾步:

(1)自定義一個類,可以是空類,如下。當然可以是空類,一般不會,應用中總要傳點什麼資料吧,是吧。

public class EventUtil {
    private String msg;  

    public EventUtil(String msg) {  
        this.msg = msg;
    }

    public String getMsg(){
        return this.msg;  
    }  
}

(2)在要接收訊息的頁面註冊:Fragment和Activity在OnCreate()方法中。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super
.onCreate(savedInstanceState); setContentView(R.layout.activity_test1); EventBus.getDefault().register(this); //註冊 }

(3)在要接收訊息的頁面註冊解除註冊:Fragment和Activity在onDestroy()方法中。

@Override
    public void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this
);//取消註冊 }

(4)在接受訊息的頁面實現四個接收函式中的任意一個,可多選。

// 接收函式一
    public  void onEvent(EventUtil event){
        String msglog = "----onEvent收到了訊息:"+event.getMsg();
        Log.d("hml",msglog); 
        bt1_activity1.setText(bt1_activity1.getText().toString()+"\n"+msglog);
    }
    // 接收函式二
    public void onEventBackgroundThread(EventUtil event){
        String msglog = "----onEventBackground收到了訊息:"+event.getMsg();
        Log.d("hml",msglog); 
        bt1_activity1.setText(bt1_activity1.getText().toString()+"\n"+msglog);
    }
    // 接收函式三
    public void onEventAsync(EventUtil event){
        String msglog = "----onEventAsync收到了訊息:"+event.getMsg();
        Log.d("hml",msglog); 
        bt1_activity1.setText(bt1_activity1.getText().toString()+"\n"+msglog);
    }
    // 接收函式四
    public  void onEventMainThread(EventUtil event) {
        String msglog = "----onEventMainThread收到了訊息:"+event.getMsg();
        Log.d("hml",msglog); 
        bt1_activity1.setText(bt1_activity1.getText().toString()+"\n"+msglog);
    }

(5)在傳送訊息的頁面,呼叫傳送訊息程式碼。一般在點選事件中

bt1_activity2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(new EventUtil("activity2傳送訊息"));
            }
        });

如果你已經這樣新增完,就可以隨意接收任何介面傳送的訊息,也可以在任何介面傳送訊息。得到效果了嗎。哈哈,相比聰明的你已經成功了。

上幾張我的gif圖片,原始碼在最後貼上。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

混淆程式碼加上如下即可:

-keepclassmembers class ** {
    public void onEvent*(**);
    void onEvent*(**);
}