您的位置:首页 > 移动开发 > Android开发

EventBus 3.0进阶-Delivery Threads (ThreadMode)传送线程(线程模式)

2016-04-13 18:07 543 查看
从学习Android开始更喜欢使用谷歌,而渐渐不再使用百度。

从学习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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  EventBus Android