Eventbus 詳解,Activity和fragment通訊,相互發送接收資料
阿新 • • 發佈:2019-02-04
最近,需要做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*(**);
}