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
- EventBus学习笔记二
- EventBus学习笔记-什么是EventBus
- Guava学习笔记:EventBus
- Guava学习笔记:EventBus
- Guava学习笔记:EventBus
- Guava学习笔记:EventBus
- EventBus学习笔记
- EventBus的学习笔记
- EventBus学习笔记
- EventBus学习笔记
- Guava学习笔记:EventBus
- EventBus 学习笔记
- Guava学习笔记:EventBus
- EventBus学习笔记
- RxJava、EventBus学习笔记
- EventBus源码学习笔记
- Android EventBus学习笔记
- EventBus学习笔记
- 文本相关的属性
- Java学习----day6——(1)面对对象程序设计进阶篇之继承篇
- Android 获取网络相关信息
- .Net 代码性能
- Stealth游戏流程总结一
- EventBus学习笔记二
- 设置好ftp后用xftp连接提示无法打开,无法显示远程文件夹
- OpenCV2.4.13 Python VideoCapture Fail 解决办法
- 学习笔记-Java并发(一)
- Windows下mysql 5.6 安装过程
- slam学习(4)
- boolean1 比较两个数是否相等
- [NODE之13]Error
- c++函数中的值传递