EventBus入门(二)

作者: 某人_Valar | 来源:发表于2017-06-29 23:18 被阅读133次

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

    相关文章

    本文结构

    • 1.EventBus的使用
    • 2.粘性(sticky)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的案例也就结束了。

    相关文章

    相关文章

      网友评论

        本文标题:EventBus入门(二)

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