16.初识Eventbus

前沿

Eventbus的原理思想就是观察者模式,当被观察者做了某个举动,观察者就会被立即通知,并做出自己的逻辑处理。简单说小偷在伸手要偷东西时,警察就会立即被通知,进行制止,这就是观察者模式,Eventbus就是根据这个原理应运而生的。

官方

https://github.com/greenrobot/EventBus

Paste_Image.png

官方给出的是在onStart中注册,在onStop中注销注册,但是在下面的例子中在这两方法中注册和注销是不行,所以个人觉得还是在onCreat中注册在onDestroy中注销。

使用

  • 添加依赖

compile 'org.greenrobot:eventbus:3.0.0'

  • 简单实例
    1、创建事件的实体类:
public class MessageEvent {

    private String message;

    public MessageEvent(String message){
        this.message = message;
    }

    public String getMessage(){
        return message;
    }
}

2、Activity one

public class MainActivity extends AppCompatActivity {

    private TextView text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //注册
        EventBus.getDefault().register(this);
        text = (TextView) findViewById(R.id.tv_text);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, Main2Activity.class));
            }
        });
    }

    //监听事件的方法
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent(MessageEvent event) {    //注意这里不能用private修饰,否则报错
        text.setText(event.getMessage());
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);  //Activity销毁注销注册
    }
}

Activity two:

public class Main2Activity extends AppCompatActivity {

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

        findViewById(R.id.sendMessageBtn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //被观察者发送事件
                EventBus.getDefault().post(new MessageEvent("发送事件后文本"));
                finish();
            }
        });
    }

效果图

one.png
two.png
three.png

订阅方法注解

进一步认识@subscribe注解:

该注解标示了当前的方法为订阅方法,该注解的内部有三个成员变量,分别为:threadMode,sticky,priority。threadMode代表订阅方法运行的线程,sticky代表是否是粘性事件,priority代表优先级。给这三个成员赋不同的值,能使订阅方法有不同的效果。

threadMode是一个枚举类型,有以下几个值:

public enum ThreadMode {
    POSTING,
    MAIN,
    BACKGROUND,
    ASYNC
}

POSTING: 表示订阅方法运行在发送事件的线程。
MAIN: 表示订阅方法运行在UI线程,由于UI线程不能阻塞,因此当使用MAIN的时候,订阅方法不应该耗时过长。
BACKGROUND: 表示订阅方法运行在后台线程,如果发送的事件线程不是UI线程,那么就使用该线程;如果发送事件的线程是UI线程,那么新建一个后台线程来调用订阅方法。
ASYNC: 订阅方法与发送事件始终不在同一个线程,即订阅方法始终会使用新的线程来运行。ThreadMode默认是使用POSTING的,如果需要更改设置,可以在添加注解的时候同时为threadMode赋值。
priority 优先级:设置该优先级的目的是,当一个事件有多个订阅者的时候,优先级高的会优先接收到事件。
sticky 粘性事件:关于粘性事件,可以参考Android的广播机制,其中有一个粘性广播,粘性广播的意思是:该广播发送后,会保存在内存中,如果后来有注册的Receiver与之匹配,那么该Receiver便会接收到该广播。那么粘性事件同理,在注册之前便把事件发生出去,等到注册之后便会收到最近发送的粘性事件(必须匹配)。注意:只会接收到最近发送的一次粘性事件,之前的会接受不到。

结束……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,288评论 19 139
  • 前言:EventBus出来已经有一段时间了,github上面也有很多开源项目中使用了EventBus。所以抽空学习...
    Kerry202阅读 1,308评论 1 2
  • 文章基于EventBus 3.0讲解。首先对于EventBus的使用上,大多数人还是比较熟悉的。如果你还每次烦于使...
    Hohohong阅读 2,348评论 0 6
  • EventBus 是一个Android端优化的 publish/subscribe 消息总线,简化了应用程序各个组...
    王世军Steven阅读 1,896评论 4 21
  • 项目到了一定阶段会出现一种甜蜜的负担:业务的不断发展与人员的流动性越来越大,代码维护与测试回归流程越来越繁琐。这个...
    fdacc6a1e764阅读 3,247评论 0 6