EventBus学习笔记二

来源:互联网 发布:人工智能视觉识别 编辑:程序博客网 时间:2024/05/21 10:09

转发请注明地址:http://blog.csdn.net/qq_36145843/article/details/66476316(谢谢~!)

上一篇文章 讲了EventBus的一个简单的demo。接下来我们讲讲EventBus的其他用法。

粘性事件
就是当一个事件发布了很久以后如果再一次注册事件可以立即获得之前处理过的粘性事件(最近发布的一个)。我们这里做一个小的测试。使用postSticky()方法来发布粘性事件。

public class MainActivity extends AppCompatActivity {    private TextView mTextView;    private Button mButton;    private ImageView mImageView;    private Button mButton2;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mTextView = (TextView) findViewById(R.id.textView);        mButton = (Button) findViewById(R.id.button);        mImageView = (ImageView) findViewById(R.id.imageView);        mButton2 = (Button) findViewById(R.id.button2);        mButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));                new Handler().postDelayed(new Runnable() {                    @Override                    public void run() {                        mTextView.setText("");                    }                },1000);                EventBus.getDefault().unregister(MainActivity.this);            }        });        mButton2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                EventBus.getDefault().register(MainActivity.this);            }        });    }    @Subscribe(sticky = true,threadMode = ThreadMode.MAIN)    public void onMessageEvent(MessageEvent event) {        Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show();        mTextView.setText(event.message);    }    @Override    protected void onStart() {        super.onStart();        //注册EventBus        EventBus.getDefault().register(this);    }    @Override    protected void onStop() {        super.onStop();        //注销EventBus        EventBus.getDefault().unregister(this);    }}

注意到上述代码在点击第一次这个按钮的时候注销了EventBus事件,然后在点击第二次按钮的时候重新注册,并且直接获得之前post的粘性事件。

运行效果如下图:
这里写图片描述

不仅如此,当你关闭这个应用然后重新打开时通过onStart()方法注册的EventBus也会直接调用粘性事件。所以我们为了防止这样的情况发生我们有可能就需要手动来删除粘性事件。

获取和删除粘性事件

1.获取粘性事件:

MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);

2.删除粘性事件:

if(stickyEvent != null) {    // "Consume" the sticky event    EventBus.getDefault().removeStickyEvent(stickyEvent);    // Now do something with it}

还可以将上述代码改变一下,变成如下的代码:(因为removeStickyEvent()方法,当你传入类时,它将返回先前持有的粘性事件。)

MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);// Better check that an event was actually posted beforeif(stickyEvent != null) {    // Now do something with it}

现在我们对刚刚的demo做一下改变点击第三个按钮的时候删除粘性事件。并使第二个按钮不能点击。

public class MainActivity extends AppCompatActivity {    private TextView mTextView;    private Button mButton;    private ImageView mImageView;    private Button mButton2;    private Button mButton3;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mTextView = (TextView) findViewById(R.id.textView);        mButton = (Button) findViewById(R.id.button);        mImageView = (ImageView) findViewById(R.id.imageView);        mButton2 = (Button) findViewById(R.id.button2);        mButton3 = (Button) findViewById(R.id.button3);        mButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));                new Handler().postDelayed(new Runnable() {                    @Override                    public void run() {                        mTextView.setText("");                    }                },1000);                EventBus.getDefault().unregister(MainActivity.this);            }        });        mButton2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                EventBus.getDefault().register(MainActivity.this);                new Handler().postDelayed(new Runnable() {                    @Override                    public void run() {                        mTextView.setText("");                    }                },1000);            }        });        mButton3.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);                if (stickyEvent != null){                    mButton2.setEnabled(false);                    Toast.makeText(MainActivity.this, "删除成功~~!", Toast.LENGTH_SHORT).show();                }                //先注销之前注册的EventBus                EventBus.getDefault().unregister(MainActivity.this);                //此时紧接着注册一个EventBus,看一下是否还有之前的粘性事件触发                EventBus.getDefault().register(MainActivity.this);            }        });    }    @Subscribe(sticky = true,threadMode = ThreadMode.MAIN)    public void onMessageEvent(MessageEvent event) {        Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show();        mTextView.setText(event.message);    }    @Override    protected void onStart() {        super.onStart();        //注册EventBus        EventBus.getDefault().register(this);    }    @Override    protected void onStop() {        super.onStop();        //注销EventBus        EventBus.getDefault().unregister(this);    }}

运行效果如下下图:
这里写图片描述

补充说明一下EventBus删除全部粘性事件使用removeAllStickyEvents()方法更快。
好了这篇文章到此结束。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 5个月发烧38度怎么办 28个月宝宝不愿把尿怎么办 16个月宝宝咳嗽怎么办 宝宝晚上不用纸尿裤要尿床怎么办 宝宝头型睡偏了怎么办 初生婴儿鼻子被奶块堵住怎么办 月经排的不顺畅怎么办 四个月的小孩拉肚子怎么办 月经期做了水光怎么办 4个多月的宝宝拉肚子怎么办 2个月婴儿积食怎么办 3个月婴儿积食怎么办 2个月的婴儿干呕怎么办 脚上的皮烂了怎么办 嘴皮里面烂了怎么办 未满月婴儿拉屎很费劲怎么办 新生儿血钙1.7怎么办啊 3个月宝宝胃口小怎么办 3个月宝宝缺钙怎么办 五个月宝宝吃手睡觉怎么办 2个月宝宝有蛲虫怎么办 四个月婴儿漏屎怎么办 母乳喂养6个月才11斤怎么办 过期的果泥肉泥怎么办? 孩子被开水烫了怎么办 小儿喝开水烫了怎么办 小孩不识字怎么办17-18 3岁宝宝不识数字怎么办 小孩数字写反了怎么办 3岁宝宝乱啃东西怎么办 闹钟的指针松了怎么办 手机想让它横屏怎么办 教孩子写作业头都被气炸了怎么办 2岁宝宝大小脸怎么办 宝宝2岁半不认识颜色怎么办 宝宝11个多月突然排斥妈妈怎么办 5个月婴儿粘妈妈怎么办 3岁宝宝记不住颜色怎么办 3岁宝宝不认字怎么办 墙纸被宝宝弄上各种颜色怎么办 三周半的孩子不认识数字怎么办