Eventbus3.0简单使用

本文介绍了EventBus 3.0的核心概念及其在Android应用中的使用方法,包括基本用法、四种线程模型及如何利用粘性事件增强组件间通信。

1.介绍

        首先,来简单的收一下Eventbus,它是一种专门针对Android优化的发布/订阅事件总线。简化了应用程序和各个组件之间与线程之间的通信。优点是开销小,代码少以及将发送者和接受者解耦。如果Activity与Activity之间互相交互的话还好一些,如果说Fragment和Fragment之间交互非常让人头痛,我们有可能会使用广播来处理,或者是setArguments()传递数据。但是这些种方法都是非常消耗时间代码都挺多的,效果而且也并不是很好。今天我们就来学习一下 Eventbus3.0 的使用方法。

2.概念

Eventbus的三要素

Event:事件,可以是任意类型的对象。
Subscriber:事件订阅者,在Eventbus3.0之前,消息处理的方法只能限定与onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync,他们分别代表着四种四种线程模型。而在Eventbus3.0后,事件处理的方法可以随便取名,但是需要添加一个@Subscriber,并且添加指定的线程。
Publisher:事件发布者,可以在任意线程任意位置发送事件,直接调用Eventbus.getDefault.post(Object o)方法就可以发送事件根据post类型会自动订阅该类型的事件。

3.四种线程

  • POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。
  • MAIN: 
    事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。
  • BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
  • ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。

4.Eventbus3.0的基本用法

   导入依赖包

compile 'org.greenrobot:eventbus:3.0.0'

  定义消息事件类

public class FirstEvent {  
  
    private String mMsg;  
    public FirstEvent(String msg) {  
    
        mMsg = msg;  
    }  
    public String getMsg(){  
        return mMsg;  
    }  
}  
在Mantivity中注册和取消事件
import android.content.Intent;
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 MainActivity extends AppCompatActivity {

    private Button btn;
    private TextView tv;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
	//注册事件
        EventBus.getDefault().register(this);

        btn = (Button) findViewById(R.id.btn);
        tv = (TextView) findViewById(R.id.tv);
       
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(MainActivity.this,Main2Activity.class);
                startActivity(i);
            }
        });
       
    }
    //订阅事件
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMoonEvent(FirstEvent messageEvent){
        tv.setText(messageEvent.getMsg());
    }
    //取消事件
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}
在Mantivity2中发送事件
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import org.greenrobot.eventbus.EventBus;

public class Main2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);


    }
    public void btnIn(View v){
        //发送事件
        EventBus.getDefault().post(new FirstEvent("AAAAAAAAAAAAAAAAAAA"));
        finish();

    }
}
实现效果:
主页面  


进入主页面进行注册事件,点击跳转到第二个页面

点击传值,会发送事件,并且关闭当前页面

我们发送的对象里边就保存了一串这样的文字,这就是效果,就是这么简单。

5.Eventbus3.0的粘性事件

  上边的讲法都很普通,Eventbus3.0还可以支持粘性事件,就是在发送该事件之后在订阅该事件也能收到该事件,对刚才的代码做一点修改
  在Mantivity中依然注册事件,但是我们接受事件的方法不一样
  
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
    public void onNianXing(FirstEvent firstEvent){
            tv.setText(firstEvent.getMsg());
    }

   当然发送事件的行为也不一样
EventBus.getDefault().postSticky(new FirstEvent("黏性事件"));
实现的效果

点击订阅,开始发送粘性事件

在主页面接收到该事件显示在页面上
好了,小编就先写到这里了,后续会有更好的文章。

推荐   http://www.cnblogs.com/angeldevil/p/3715934.html

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值