EventBus的使用(组件间通信)
2018-01-02 16:51
477 查看
EventBus(GitHub地址):https://github.com/greenrobot/EventBus
EventBus 是一款针对 Android 优化的发布/订阅事件总线。
EventBus 能极大简化两个组件之间的通信问题,且效率极高。
EventBus 3.0版本后,开发者能够自定义订阅方法的名字,而没必要规定以“onEventXX”开头的方法了,这样也自由化了很多,而且支持了粘性事件的分发等。
主要功能:替代Intent,Handler,BroadCast 在 Activity与Activity、Activity与Fragment,Service,线程之间传递消息或数据。
优点:开销小、代码更优雅、发送者和接收者解耦。
原理
实现步骤 —>
第一步,添加依赖,目前版本是3.1.1,根据最新版本更改
第二步,自定义消息事件,构造中的参数可以根据需求定义数据类型
第三步,注册、注销 EventBus,自定义订阅方法
第四步,发送消息
第五步,混淆
几个扩展方法
粘性事件(未完待续)
完整代码
EventBus 是一款针对 Android 优化的发布/订阅事件总线。
EventBus 能极大简化两个组件之间的通信问题,且效率极高。
EventBus 3.0版本后,开发者能够自定义订阅方法的名字,而没必要规定以“onEventXX”开头的方法了,这样也自由化了很多,而且支持了粘性事件的分发等。
主要功能:替代Intent,Handler,BroadCast 在 Activity与Activity、Activity与Fragment,Service,线程之间传递消息或数据。
优点:开销小、代码更优雅、发送者和接收者解耦。
原理
实现步骤 —>
第一步,添加依赖,目前版本是3.1.1,根据最新版本更改
compile 'org.greenrobot:eventbus:3.1.1'
第二步,自定义消息事件,构造中的参数可以根据需求定义数据类型
public class MessageEvent { private String message; public MessageEvent(String message){ this.message = message; } public String getMessage(){ return message; } }
第三步,注册、注销 EventBus,自定义订阅方法
//在 onCreate 方法中注册 EventBus @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //需要接收数据的组件,注册 EventBus,成为订阅者 EventBus.getDefault().register(this); } //在 onDestroy方法中注销 EventBus @Override public void onDestroy() { super.onDestroy(); //需要接收数据的组件,注销 EventBus EventBus.getDefault().unregister(this); } /* EventBus 3.0之后,订阅方法的方法名支持自定义,无需硬性规定以 onEventXX 开头定 义的方法名,但要用 public 修饰该方法,需要使用 @Subscribe 注解,表示在调用 register后该订阅方法才有效,当接收到事件的时候,会调用该方法。 只有那些同时满足public访问权限、非static方法、非abstract方法、有且只有一个参数 和使用了@Subscribe注解的方法才被当做是合法的订阅者方法。 EventBus 中的 threadMode ----> ThreadMode.Main:如果当前线程就是主线程,那么直接调用订阅者方法,在主线程执行。反之,先进入队列,后面将在主线程的Handler中调用订阅者方法。 ThreadMode.MAIN_ORDERED:直接进入队列,后面将在主线程的Handler中调用订阅者方法。 ThreadMode.Post:该方法的执行和事件发送者在同一个线程中,适用于对是否在 主线程执行无要求的情况,但post线程为主线程,则不能有耗时操作。 ThreadMode.Background:如果发送事件的线程不是UI线程,则运行在该线程中。如果发 送事件的是UI线程,则它运行在由EventBus维护的一个单独的线程中。多个事件会同步地被 这个单独的后台线程所处理。适用于轻微耗时的操作,比如读写数据库。 ThreadMode.Async:运行在单独的工作线程中,不论发送事件的线程是否为主线程。 跟BackgroundThread不一样,该模式的所有线程是独立的,因此适用于长耗时操作,例如网络访问。 */ //需要接受数据的组件,自定义订阅方法 @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(MessageEvent messageEvent){ Log.d(TAG, "receive message"); textView.setText(messageEvent.getMessage()); }
第四步,发送消息
public void onClick(View view){ String text = "组件间通信成功:数据同步完成"; EventBus.getDefault().post(new MessageEvent(text)); }
第五步,混淆
//防止被混淆 未完待续
几个扩展方法
粘性事件(未完待续)
完整代码
//MessageEvent.java
public class MessageEvent { private String message; public MessageEvent(String message){ this.message = message; } public String getMessage(){ return message; } }
//activity_main.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout 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" tools:context="com.example.test.MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick" android:text="打开SecondActivity" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="MainActivity" /> </FrameLayout>
//activity_second.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick" android:text="打开ThirdActivity" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="SecondActivity" /> </FrameLayout>
//activity_third.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onClick" android:text="组件通信" /> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="ThirdActivity" /> </FrameLayout>
//MainActivity.java public class MainActivity extends Activity { private static final String TAG = "MainActivity.this"; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //需要接受数据的地方,注册EventBus EventBus.getDefault().register(this); textView = (TextView) findViewById(R.id.textView); } public void onClick(View view) { startActivity(new Intent(this, SecondActivity.class)); } //订阅方法,当接收到事件的时候,会调用该方法 @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(MessageEvent messageEvent){ Log.d(TAG, "receive message"); textView.setText(messageEvent.getMessage()); } @Override public void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } }
//SecondActivity.java public class SecondActivity extends AppCompatActivity { private static final String TAG = "SecondActivity.this"; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); //需要接受数据的地方,注册EventBus EventBus.getDefault().register(this); textView = (TextView) findViewById(R.id.textView); } public void onClick(View view){ startActivity(new Intent(this, ThirdActivity.class)); } //订阅方法,当接收到事件的时候,会调用该方法 @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(MessageEvent messageEvent){ Log.d(TAG, "receive message"); textView.setText(messageEvent.getMessage()); } @Override public void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } }
//ThirdActivity.java public class ThirdActivity extends Activity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_third); textView = (TextView) findViewById(R.id.textView); } public void onClick(View view){ String text = "组件间通信成功:数据同步完成"; EventBus.getDefault().post(new MessageEvent(text)); textView.setText(text); } }
相关文章推荐
- 安卓组件通信:eventBus的使用
- EventBus(组件与后台线程间的通信)的简单使用
- 使用EventBus轻松实现组件间通信
- EventBus的使用与原理 组件通信 线程通信(1)
- Android EventBus组件间通信的使用及详解
- 使用reflux进行react组件之间的通信
- Android 框架炼成 教你如何写组件间通信框架EventBus
- 使用EventBus在Activity与BroadcastReceiver之间进行通信
- Android组件间通讯Eventbus日常使用
- Android 框架炼成 教你如何写组件间通信框架EventBus(三)
- Android 框架炼成 教你如何写组件间通信框架EventBus
- K3中间层无法使用DCOM组件无法与服务器通信
- vue.js之路(4)——vue2.0s中eventBus实现兄弟组件通信
- 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。 与基础事务管理器的通信失败。 .net 代码里 写事务代码
- 安卓Service组件使用系列6:使用AIDL完成两个进程间的通信
- 使用Broadcast实现android组件之间的通信
- Vue组件通信之Bus的具体使用
- 使用Vue开发网站之路2-多组件通信1(利用bus总线进行事件触发)
- 使用Vue开发网站之路2-多组件通信3(父子间通信,组件与vue通信)
- 使用Delphi的Socket组件进行阻塞方式通信的零碎