- 优缺点
-
-
- 调度灵活。不依赖于 Context,使用时无需像广播一样关注 Context 的注入与传递。父类对于通知的监听和处理可以继承给子类,这对于简化代码至关重要;通知的优先级,能够保证 Subscriber 关注最重要的通知;粘滞事件(sticky events)能够保证通知不会因 Subscriber 的不在场而忽略。可继承、优先级、粘滞,是 EventBus 比之于广播、观察者等方式最大的优点,它们使得创建结构良好组织紧密的通知系统成为可能。
- 使用简单。EventBus 的 Subscriber 注册非常简单,调用 eventBus 对象的 register 方法即可,如果不想创建 eventBus 还可以直接调用静态方法 EventBus.getDefault() 获取默认实例,Subscriber 接收到通知之后的操作放在 onEvent 方法里就行了。成为 Publisher 的过程就更简单了,只需要调用合适的 eventBus(自己创建的或是默认的)的 post 方法即可。
- 快速且轻量。作为 github 的明星项目之一, EventBus 的源代码中许多技巧来改善性能,
eventbus的缺点是他的代码逻辑不是很清楚,在 Subscriber 注册的时候,Subscriber 中的方法会被遍历查找以 onEvent 开头的 public 方法。这将带来一些问题,一旦对代码进行混淆,就无法查找到了。好消息是 EventBus 已经打算使用注解来实现,这应该能够解决代码混淆的问题。
但有一个缺点是观察者独有的,那就是观察者可能会造成接口的膨胀。特别是当程序要求大量形式各异的通知,而程序员有没有做出良好的抽象时,代码中会包含大量的接口,接口数量的增长又会带来命名、注释等等一大堆问题。本质上说观察者要求程序员从零开始实现事件的产生、分发与处理过程,这就要求参与者必须对整个通知过程有着良好的理解。当程序代码适量时,这是一个合理的要求,然而当程序太大时,这将成为一种负担。
最原始的依赖
compile 'org.greenrobot:eventbus:3.0.0'
两个activity之间传值 一个传递类
package com.example.eventbus; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import org.greenrobot.eventbus.*; import org.greenrobot.eventbus.EventBus; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button tioa; private TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); org.greenrobot.eventbus.EventBus.getDefault().register(this); } private void initView() { tioa = (Button) findViewById(R.id.tioa); text = (TextView) findViewById(R.id.text); tioa.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.tioa: Intent intent=new Intent(this,Main2Activity.class); startActivity(intent); break; } } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } @Subscribe(threadMode = ThreadMode.MAIN) public void kkk(SSS d){ Log.d("zzz","MAIN//"+d.getS()); text.setText(d.getS()); } /*其他线程 * ThreadMode.Main:表示这个方法在主线程中执行(适合做异步加载,可以将子线程加载到数据直接设置到UI界面)。 ThreadMode.Posting:表示该方法和消息发送方在同一个线程。 ThreadMode.ASYNC:表示无论发送方是在子线程还是在主线程,都会开一个新的子线程去运行,适用于多 个线程任务,内部有线程池管理,比如请求网络时,用这个方法,他会自动创建方法去请求,可以异步并发处理。 ThreadMode.BackGround:表示该方法在后台运行(也就是子线程),不能够并发处理,如果发布者在子线程, 那么该方法就在子线程执行。如果发布者在主线程,那么该方法就会创建一个子线程,在子线程运行。 * */ /* @Subscribe(threadMode = ThreadMode.ASYNC) public void kkk1(SSS d){ Log.d("zzz","ASYNC//"+d.getS()); } @Subscribe(threadMode = ThreadMode.POSTING) public void kkk2(SSS d){ Log.d("zzz","POSTING//"+d.getS()); } @Subscribe(threadMode = ThreadMode.BACKGROUND) public void kkk3(SSS d){ Log.d("zzz","BACKGROUND//"+Thread.currentThread().getName()); }*/ } //<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.eventbus.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tioa" android:text="跳转到第二个" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/text" /> </LinearLayout>
/第二个activiypackage com.example.eventbus; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import org.greenrobot.eventbus.*; /* * 导入原始依赖 compile 'org.greenrobot:eventbus:3.0.0' * *自定义一个用于传递信息的类 一个数值 构造方法 getset方法 * * 初始类 (也就是接收值得自定义方法的类) 需要注册和销毁 * org.greenrobot.eventbus.EventBus.getDefault().register(this); * EventBus.getDefault().unregister(this); * *接收值得自定义方法 方法名自定义 必须是公共类型 只能有一个参数 为传递信息类 通过get方法传值 * * * 黏性事件 * * 一方向传递信息的类发送消息 使用 EventBus.getDefault().postSticky(new DDD("今天打老虎"));方法 * * 另一方接收 使用接收方法时要用 * @Subscribe(threadMode = ThreadMode.MAIN,sticky=true) public void zk(DDD ddd){ text.setText(ddd.getS()); } 黏性事件就是 值发送过来后 你可以自己选择什么时候拿这个值 什么时候拿接什么时候注册 如果不拿 下一个值通过Eventbus过来是会覆盖当前这个值 注册和销毁 是和接收消息的自定义方法在一个类里面的 * * */ public class Main2Activity extends AppCompatActivity implements View.OnClickListener { private Button hui; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); initView(); } private void initView() { hui = (Button) findViewById(R.id.hui); hui.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.hui: new Thread(){ @Override public void run() { super.run(); org.greenrobot.eventbus.EventBus.getDefault().post(new SSS("张凯")); } }.start(); break; } } }//布局<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.eventbus.Main2Activity" android:orientation="vertical" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="回传" android:id="@+id/hui" /> </LinearLayout>package com.example.eventbus; /** * Created by Administrator on 2017/12/27 0027. */ public class SSS { private String s; public SSS(String s) { this.s = s; } public String getS() { return s; } }
黏性事件/
package com.example.eventbusnian; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import org.greenrobot.eventbus.EventBus; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button tiao1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { tiao1 = (Button) findViewById(R.id.tiao1); tiao1.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.tiao1: EventBus.getDefault().postSticky(new DDD("今天打老虎")); Intent intent=new Intent(this,Main2Activity.class); startActivity(intent); break; } } }<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.eventbusnian.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="1111" android:id="@+id/tiao1" /> </LinearLayout>package com.example.eventbusnian; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; public class Main2Activity extends AppCompatActivity implements View.OnClickListener { private Button tiao2; private TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); initView(); } private void initView() { tiao2 = (Button) findViewById(R.id.tiao2); text = (TextView) findViewById(R.id.text); tiao2.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.tiao2: EventBus.getDefault().register(this); break; } } @Subscribe(threadMode = ThreadMode.MAIN,sticky=true) public void zk(DDD ddd){ text.setText(ddd.getS()); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.eventbusnian.Main2Activity" android:orientation="vertical" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="111" android:id="@+id/tiao2" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/text" /> </LinearLayout> ///package com.example.eventbusnian; /** * Created by Administrator on 2017/12/27 0027. */ public class DDD { private String s; public DDD(String s) { this.s = s; } public String getS() { return s; } }