Android EventBus發布/訂閱事件總線

jopen 9年前發布 | 12K 次閱讀 Android Android開發 移動開發

做過Android開發都會陸續用到這個開源庫EventBus。EventBus是一款針對Android優化的發布/訂閱事件 總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點 是開銷小,代碼更優雅。以及將發送者和接收者解耦。下載EventBus的類庫源碼:https://github.com/greenrobot/EventBus。下面說說簡單用法。

本文項目資源下載:

一、先定義一個消息實體類MainSendEvent

package com.example.eventbusdemo;

/**

  • 事件消息實體類
  • @author mmxs / public class MainSendEvent { protected String mstrMsg;

    public MainSendEvent(String msg) {

     mstrMsg = msg;
    

    }

    public String getStringMsgData(){

     return mstrMsg;
    

    } }</pre>二、MainActivity

    package com.example.eventbusdemo;

import de.greenrobot.event.EventBus; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import android.app.Activity; import android.content.Intent;

public class MainActivity extends Activity implements OnClickListener{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //事件注冊
    EventBus.getDefault().register(this);
    InitUI();
}

private void InitUI() {
    Button button = (Button)findViewById(R.id.button1);
    button.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.button1:
        Intent intent = new Intent();
        intent.setClass(MainActivity.this, TwoActivity.class);
        startActivity(intent);
        break;

    default:
        break;
    }

}

//事件接受
public void onEventMainThread(MainSendEvent event){
    if(event != null){
        Toast.makeText(getApplicationContext(),
                "MainActivity接受數據" + event.getStringMsgData(),
                Toast.LENGTH_LONG).show();  
        TextView textView = (TextView)findViewById(R.id.textView1);
        textView.setText(event.getStringMsgData());
    }
}

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

}</pre>三、TwoActivity

package com.example.eventbusdemo;

import de.greenrobot.event.EventBus; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; /**

  • 第二個TwoActivity發送事件
  • @author mmsx / public class TwoActivity extends Activity implements OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_two);

    Button button = (Button)findViewById(R.id.button1);
    button.setOnClickListener(this);

}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.button1:
        //事件發送
        EventBus.getDefault().post(new MainSendEvent("from TwoActivity msg"));
        break;
    default:
        break;
    }

}




}</pre>四、兩個activity的布局

1、activity_main

<LinearLayout xmlns:android="

<Button
    android:id="@+id/button1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="第二個activity" />

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="TextView" />

</LinearLayout></pre>2、activity_two

<LinearLayout xmlns:android="

<Button
    android:id="@+id/button1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="MainActivity" />

</LinearLayout></pre>在這上面總體上實踐就是在activity間消息傳遞。我們先進去的是MainActivity。然后按button進入第二個 activity。在第二個activity按一下button發送數據到MainActivity,用Toat彈出以及settext。返回 MainActivity后能看到settext效果。

五、效果圖

 Android EventBus發布/訂閱事件總線

六、簡單來說的流程

1、事件注冊或者訂閱

EventBus.getDefault().register(this);
2、事件注冊或者訂閱后的接受
public void onEventMainThread(MainSendEvent event){
        if(event != null){
            Toast.makeText(getApplicationContext(),
                    "MainActivity接受數據" + event.getStringMsgData(),
                    Toast.LENGTH_LONG).show();  
            TextView textView = (TextView)findViewById(R.id.textView1);
            textView.setText(event.getStringMsgData());
        }
    }
3、事件注冊或者訂閱取消

EventBus.getDefault().unregister(this);
這上面3點是一起,同一個頁面。

4、事件的發送者

EventBus.getDefault().post(new MainSendEvent("from TwoActivity msg"));
七、參考文章

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!