转发请注明地址: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()方法更快。
好了这篇文章到此结束。