例:
组件与组件之间的传递代替Intent,线程间的通讯代替handler
加依赖:
dependencies { compile 'org.greenrobot:eventbus:3.0.0' }
加权限:
MainActivity
/** * 创建Module,关联EventBus框架,创建第2个Activity * * 完成Module的布局及控件的初始化 * * 注册EventBus,解除EventBus注册 * * 创建EventBus消息类,设置属性 * * 使用EventBus的Post方法发送事件 * * 根据消息类,接收事件 * * 组件与组件之间的传递代替Intent,线程间的通讯代替handler */ public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button button; private TextView tv_title; private EventBus mEventBus; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //得到EventBUs对象 这里可以new出EventBUs,感兴趣的可以调研 mEventBus = EventBus.getDefault(); //注册EventBus,关于源码我只强调一点:EventBus拿到订阅方法,就两种手段:1.注解 2.反射 mEventBus.register(this); } @Override protected void onDestroy() { super.onDestroy(); //解除EventBUs注册 mEventBus.unregister(this); } /** 注重过程,接受结果 * 接收发送过来的消息 //提示:在写接收消息方法,方法名自定义,权限必须是public,参数必须和发送消息的消息类一致 * 注释:方便人的阅读 注解: * ThreadMode.MAIN表示这个方法在主线程中执行 * 提示,发送方的线程也会影响到接收方 */ @Subscribe(threadMode = ThreadMode.MAIN) public void eBSAEventBus(EBMessage ebMessage){ //使用咱们接收过来的消息 tv_title.setText(ebMessage.Message); Log.d("EventBusThread","MAIN"+Thread.currentThread().getName()); } // @Subscribe(threadMode = ThreadMode.POSTING) // public void eBSAEventBus1(EBMessage ebMessage){ // Log.d("EventBusThread","POSTING"+Thread.currentThread().getName()); // } // // @Subscribe(threadMode = ThreadMode.ASYNC) // public void eBSAEventBus2(EBMessage ebMessage){ // Log.d("EventBusThread","ASYNC"+Thread.currentThread().getName()); // } // // @Subscribe(threadMode = ThreadMode.BACKGROUND) // public void eBSAEventBus3(EBMessage ebMessage){ // Log.d("EventBusThread","BACKGROUND"+Thread.currentThread().getName()); // } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button: // startActivity(new Intent(this,EventBusSendActivity.class)); new Thread(){ public void run() { mEventBus.post(new EBMessage("我是子线程里信息,现在到主线程去展示")); }; }.start(); break; } }
activity_main
xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/button" android:text="跳转到发送页面的Activity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true"/> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/button" android:layout_centerHorizontal="true" android:layout_marginTop="35dp"/> RelativeLayout>
EBMessage 创建EventBus消息类,设置属性
/**
* 消息类,一个容器,负责存放一些数据,方便我们传到另一个地方,获取信息
*/
public class EBMessage { public String Message; public EBMessage(String message) { Message = message; } }
EventBusSendActivity
public class EventBusSendActivity extends AppCompatActivity { String mString = "1601Rnb,月薪过万"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_event_bus_send); } public void send(View view){ //4.咱们把第二个页面里面的数据,发送给主页面接收,参数也必须是和消息类一致方可 EventBus.getDefault().post(new EBMessage(mString)); finish(); } }activity_event_bus_send 布局:
xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_event_bus_send" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:onClick="send" android:text="向主页面使用EventBus发送一个事件" android:layout_width="wrap_content" android:layout_height="wrap_content"/> RelativeLayout>