美文网首页
16.初识Eventbus

16.初识Eventbus

作者: Jsonzhang | 来源:发表于2017-04-27 16:00 被阅读5次

    前沿

    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便会接收到该广播。那么粘性事件同理,在注册之前便把事件发生出去,等到注册之后便会收到最近发送的粘性事件(必须匹配)。注意:只会接收到最近发送的一次粘性事件,之前的会接受不到。

    结束……

    相关文章

      网友评论

          本文标题:16.初识Eventbus

          本文链接:https://www.haomeiwen.com/subject/mnzgzttx.html