EventBus2.4的使用

我需要三件东西:爱情友谊和图书。然而这三者之间何其相通!炽热的爱情可以充实图书的内容,图书又是人们最忠实的朋友。
                                                                                                                                                                                                          —— 蒙田


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    
这篇博客写的不错。










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值