Android EventBus发布/订阅事件总线

jopen 9年前

做过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;   }  }
二、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();   }   }
三、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;    }       }           }
四、两个activity的布局

1、activity_main

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical" >        <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>
2、activity_two
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:orientation="vertical" >        <Button          android:id="@+id/button1"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:text="MainActivity" />    </LinearLayout>
在这上面总体上实践就是在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"));
七、参考文章