16.初识Eventbus

2017-04-27  本文已影响5人  Jsonzhang

前沿

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

官方

https://github.com/greenrobot/EventBus

Paste_Image.png

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

使用

compile 'org.greenrobot:eventbus:3.0.0'

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

结束……

上一篇下一篇

猜你喜欢

热点阅读