EventBus学习笔记二

转发请注明地址: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 before
if(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值