EventBus 3.0进阶-Delivery Threads (ThreadMode)传送线程(线程模式)
2016-04-13 18:07
543 查看
从学习Android开始更喜欢使用谷歌,而渐渐不再使用百度。
从学习Android开始更喜欢看英文的文档,渐渐不喜欢看中文的文档,尤其是翻译比较恶心的中文文档,不是显摆英语有多牛逼,而是为了努力锻炼自己。
歪果仁讲技术比较清楚明了,讲某项技术的时候先定义它,也就是讲明白它是什么,是用来干什么的;而我写技术文档的时候就容易忽略,以至于我的《EventBus3.0
快速开始(Android Studio)》这篇文章没有讲,下面我就给大家补上。
将事件发送者和事件接受者之间解耦
在Activities,Fragments和后台线程中运行良好
避免复杂的容易出错的关联和生命周期的问题
使你的代码更加简洁
速度快
jar包小 (<50k jar)
使用EventBus的软件安装量在亿次以上,广泛使用
有高级的属性比如发送线程模式,订阅者的优先级,等等
接着进入正题,看一下Eventbus的传送线程的线程模式,首先我们先看一下代码,看一下运行效果,在分析结果;
代码如下所示:
ThreadMode: POSTING 这个订阅者(方法)和post在同一个线程中。
EventBus能够为你处理线程:事件能够从不同的线程之间进行传送。一个普通的用例就是处理UI变化。在Android中,UI变化必须在UI(主)线程中被完成。另一方面,网络请求或者其他耗时的任务,必须在工作线程中运行。EventBus帮助你处理这些任务与UI线程同步(没有必要深入研究线程转换,使用AsyncTask,等等)。
就写到这里了,如果有问题,请您指正,
如果对EventBus 3.0不太了解,请参考我的另一篇文章《EventBus3.0 快速开始(Android
Studio)》。
参考内容:http://greenrobot.org/eventbus
参考内容:http://greenrobot.org/eventbus/documentation/delivery-threads-threadmode/
从学习Android开始更喜欢看英文的文档,渐渐不喜欢看中文的文档,尤其是翻译比较恶心的中文文档,不是显摆英语有多牛逼,而是为了努力锻炼自己。
歪果仁讲技术比较清楚明了,讲某项技术的时候先定义它,也就是讲明白它是什么,是用来干什么的;而我写技术文档的时候就容易忽略,以至于我的《EventBus3.0
快速开始(Android Studio)》这篇文章没有讲,下面我就给大家补上。
EventBus 是什么?
EventBus是为Android优化过的订阅发布模式的事件总线。EventBus的优点是什么?
简化组件之间的通讯将事件发送者和事件接受者之间解耦
在Activities,Fragments和后台线程中运行良好
避免复杂的容易出错的关联和生命周期的问题
使你的代码更加简洁
速度快
jar包小 (<50k jar)
使用EventBus的软件安装量在亿次以上,广泛使用
有高级的属性比如发送线程模式,订阅者的优先级,等等
接着进入正题,看一下Eventbus的传送线程的线程模式,首先我们先看一下代码,看一下运行效果,在分析结果;
代码如下所示:
public class SecondActivity extends AppCompatActivity { Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content_main); button = (Button) findViewById(R.id.button); EventBus.getDefault().register(this); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EventBus.getDefault().post(new MessageEvent("EventBus first")); } }); new Thread(){ @Override public void run() { try{ Thread.sleep(3000); }catch (Exception e){ } EventBus.getDefault().post(new MessageEvent("EventBus new thread")); } }.start(); } @Subscribe(threadMode = ThreadMode.POSTING) public void onMessagePosting(MessageEvent event){ System.out.println("onMessagePosting===" + event.message +" Thread name==" + Thread.currentThread().getName()); } @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageMain(MessageEvent event){ System.out.println("onMessageMain===" + event.message+" Thread name==" + Thread.currentThread().getName()); } @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onMessageBackground(MessageEvent event){ System.out.println("onMessageBackground===" + event.message+" Thread name==" + Thread.currentThread().getName()); } @Subscribe(threadMode = ThreadMode.ASYNC) public void onMessageAsync(MessageEvent event){ System.out.println("onMessageAsync===" + event.message+" Thread name==" + Thread.currentThread().getName()); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); } // its super classes have no public methods with the @Subscribe annotati 必须是public方法 }
启动之后,创建的线程中发送的事件执行结果如下:
Button点击之后,发送的事件执行结果如下:
根据执行的结果,来学习线程模式:
ThreadMode: POSTING 这个订阅者(方法)和post在同一个线程中。
ThreadMode: MAIN:订阅者将在Android的主线程(UI线程)中被调用。
ThreadMode: BACKGROUND:订阅者将在后台线程中被调用。如果发送时候的线程不是主线程,事件处理方法将直接在发送时的线程中被调用。
如果发送时候的线程是主线程,EventBus使用一个单一后台线程来进行顺序传送所有它的事件(在同一个Activity生命周期内,以后一直使用这个后台线程,所以
第N次点击时候和第一次点击时候BACKGROUND的线程名称是一致的)。
ThreadMode: ASYNC:订阅者将在一个单独的线程中被调用。这个线程独立于发送时的线程和主线程。EventBus使用一个线程池来高效复用线程,复用
线程来自于异步的事件处理通知。EventBus能够为你处理线程:事件能够从不同的线程之间进行传送。一个普通的用例就是处理UI变化。在Android中,UI变化必须在UI(主)线程中被完成。另一方面,网络请求或者其他耗时的任务,必须在工作线程中运行。EventBus帮助你处理这些任务与UI线程同步(没有必要深入研究线程转换,使用AsyncTask,等等)。
就写到这里了,如果有问题,请您指正,
如果对EventBus 3.0不太了解,请参考我的另一篇文章《EventBus3.0 快速开始(Android
Studio)》。
参考内容:http://greenrobot.org/eventbus
参考内容:http://greenrobot.org/eventbus/documentation/delivery-threads-threadmode/
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories