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

从学习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/



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EventBus是一种用于Android应用程序中发布/订阅事件的库。它遵循发布-订阅模式,允许不同组件之间进行松散耦合的通信。 在基于EventBus 3.0的APP开发中,你可以按照以下步骤进行: 1. 添加EventBus依赖 在项目的build.gradle文件中添加以下代码: ``` dependencies { implementation 'org.greenrobot:eventbus:3.2.0' } ``` 2. 创建事件类 创建一个事件类,它将包含你需要发送和接收的数据。例如: ``` public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; } } ``` 3. 注册订阅者 在需要接收事件的组件中,注册订阅者。例如,在Activity中: ``` @Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); } ``` 4. 发布事件 在需要发送事件的组件中,发布事件。例如,在Activity中: ``` EventBus.getDefault().post(new MessageEvent("Hello, world!")); ``` 5. 处理事件 在订阅者中,创建一个方法来处理接收到的事件。例如,在Activity中: ``` @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { // Do something with the event Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show(); } ``` 以上就是基于EventBus 3.0的APP开发的基本步骤。通过使用EventBus,你可以轻松地在不同组件之间传递数据,从而实现应用程序中的松散耦合通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值