Android知识Android开发经验谈Android开发

EventBus入门(二)

2017-06-29  本文已影响133人  某人_Valar

作者:某人_Valar
如需转载请保留原文链接
EventBus的GitHub地址:https://github.com/greenrobot/EventBus
本文会把包括两个EventBus的案例,来简单实现EventBus的使用。

相关文章

本文结构

两者的区别,普通的EventBus使用都是需要先注册(register),再发送消息(POST),才能接收到数据。
如果使用postSticky发送,就先接受到数据,之后在进行注册时,数据就随之展现出来。

1.EventBus的使用

1.1 引用包
compile 'org.greenrobot:eventbus:3.0.0'
1.2 准备

新建了一个EventBusActivity当做发送数据界面,新建一个ResultActivity用于呈现结果,在activity_main.xml中添加一个按钮,

<Button
        android:id="@+id/bt_eventBus"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点击进入EventBus测试"
        />

并在MainActivity中添加一个点击事件跳转到EventBusActivity。

Button mButton = (Button) findViewById(R.id.bt_eventBus);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this,EventBusActivity.class);
                startActivity(intent);
            }
        });
1.3 注册与解注册

在EventBusActivity的onCreate()方法中注册

EventBus.getDefault().register(EventBusActivity.this);

重写EventBusActivity的onDestroy()方法进行解注册

@Override
    protected void onDestroy() {
        super.onDestroy();
        //3.3 解注册
        EventBus.getDefault().unregister(EventBusActivity.this);
    }
1.4 创建发送消息类

新建一个MyMessage类如下

public class MyMessage {

    public String name;

    public MyMessage(String name){
        this.name = name;
    }
}
1.5 发送消息

可自己添加一个按钮,点击即发送

mbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                EventBus.getDefault().post(new MyMessage("主线程发送的数据-001"));
                
                //发送之后跳转到ResultActivity界面查看结果
                Intent intent = new Intent(EventBusActivity.class,ResultActivity.class);
                startActivity(intent);

            }
}
1.6 接收消息

为ResultActivity添加一个TextView用于展示接收到的数据。

@Subscribe(threadMode = ThreadMode.MAIN)  //用注解的方式设定接收方式
    public void ReceiveMessage(MyMessage myMessage){
        //显示接收的消息
        mTextView.setText(myMessage.name);
    }

这样我们第一个EventBus案例就实现了。

2.粘性EventBus的使用

2.1-2.2 参考本文1.1与1.2
2.3 创建发送消息类(与1.4相同)
public class MyMessage {
    public String name;
    public MyMessage(String name){
        this.name = name;
    }
}
2.4 发送消息

这里所使用的就是 EventBus.getDefault().postSticky()方法

mbt_eventBus_sticky.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //发送消息
                EventBus.getDefault().postSticky(new StickyMessage("这里是粘性事件发送的数据-002"));

                //跳转到接收消息的页面
                Intent intent = new Intent(EventBusActivity.this,ResultActivity.class);
                startActivity(intent);
            }
        });
2.5 接收消息

在确定接收方式之后,需要加上sticky = true

@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
    public void ReceiveSticky(StickyMessage stickyMessage){
        mTextView.setText(stickyMessage.msg);  //这时虽然已经为TextView赋值,但是暂时不会显示出来。
    }
2.6 注册

在ResultActivity设置一个按钮,点击即注册EventBus
这里要注意添加一个判断条件,如果EventBus被注册多次会出现异常。

mbt_receiveSticky.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (isFirst){
                    // 注册
                    EventBus.getDefault().register(ResultActivity.this);
                    isFirst = false;
                }else {
                    Toast.makeText(ResultActivity.this,"你已经注册过了EventBus",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });
2.7解注册

重写ResultActivity的onCreate()方法

@Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().removeAllStickyEvents(); //移除所有的粘性事件
        EventBus.getDefault().unregister(ResultActivity.this);
    }

到此粘性EventBus的案例也就结束了。

相关文章

上一篇下一篇

猜你喜欢

热点阅读