我需要三件东西:爱情友谊和图书。然而这三者之间何其相通!炽热的爱情可以充实图书的内容,图书又是人们最忠实的朋友。
|
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
1、下载EventBus的类库源码:https://github.com/greenrobot/EventBus
2、将EventBus.jar放入自己工程的libs目录即可
3、定义一个事件,这个事件一旦被EventBus分发出去就是代表某一件事情发生了,这个事件就是某个观察者关心的事情(不需要继承任何类)
4、定义观察者,然后将该观察者注册到EventBus
5、由EventBus分发事件,告知观察者某一件事情发生了
6、使用完成后从EventBus中反注册观察者。
//具体代码如下,先做一个简单的demo: 这是一个跳转传值的
首先导个jar包:可以下载,
接下来是代码,先是布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/but_skip" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="跳转" /> <TextView android:id="@+id/text_direction" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_next" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/but_send" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送" /> </RelativeLayout>接下来时Mainactivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Button but_skip; private TextView text_direction; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
//需要注册: EventBus.getDefault().register(this); initview(); } private void initview() { but_skip = (Button) findViewById(R.id.but_skip); text_direction = (TextView) findViewById(R.id.text_direction); but_skip.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,NextActivity.class); startActivity(intent); }这个方法是接收的:
public void onEventMainThread(Beanclass event) { String msg = event.getName(); int age = event.ge text_direction.setText(msg+",年龄"+age); Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); } //销毁 @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } }
public class NextActivity extends AppCompatActivity implements View.OnClickListener{ private Button but_send; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_next); initview(); } private void initview() { but_send = (Button) findViewById(R.id.but_send); but_send.setOnClickListener(this); } @Override public void onClick(View v) { EventBus.getDefault().post( new Beanclass("我叫刘健瑞",23)); finish(); } }最后是bean包:
public class Beanclass { private String name; private int age; public Beanclass(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Beanclass{" + "name='" + name + '\'' + ", age=" + age ; } }
在EventBus中的观察者通常有四种订阅函数(就是某件事情发生被调用的方法)
1、onEvent
2、onEventMainThread
3、onEventBackground
4、onEventAsync
这四种订阅函数都是使用onEvent开头的,它们的功能稍有不同,在介绍不同之前先介绍两个概念:
告知观察者事件发生时通过EventBus.post函数实现,这个过程叫做事件的发布,观察者被告知事件发生叫做事件的接收,是通过下面的订阅函数实现的。
onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEvnetBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
EventBus2.4和3.0的区别:
3与2主要区别在代码使用简化和性能更快上。详细如下:
-
EventBus 2.x 必须定义以onEvent开头的几个方法,代码中语境比较突兀,且有可能会导致拼写错误,例如数据同步事件
-
EventBus 3.0 函数名字不再受到权限,而且可以在一个函数中体现出在哪个线程执行,并且可指定接收事件的优先级
-
EventBus 2.x 注册方式也比较繁琐。EventBus 3.0 注册方式只有一个
-
EventBus 2.x 是采用反射的方式对整个注册的类的所有方法进行扫描来完成注册,当然会有性能上的影响。EventBus 3.0中EventBus提供了EventBusAnnotationProcessor注解处理器来在编译期通过读取@Subscribe()注解并解析、处理其中所包含的信息,然后生成java类来保存所有订阅者关于订阅的信息,这样就比在运行时使用反射来获得这些订阅者的信息速度要快
EventBus3.0的详细使用:
http://blog.csdn.net/lsyz0021/article/details/52094855
这篇博客写的不错。