关于Eventbus的各个注解的讲解

使用eventbus来管理线程

Posting

订阅方和发送方在同一线程中执行 “”“订阅方和发送方在同一线程中执行”

@Subscribe(threadMode = ThreadMode.POSTING)
    public void onPostingEvent(final PostingEvent event){
       final String threadinfo = Thread.currentThread().toString();//主要是看和发布方的是不是在一个线程里面
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                setPublisherThreadInfo(event.Threadinfo);//发布方的线程
                setSubscriberThreadInfo(threadinfo);//如果不是先写好的,就会一直显示main线程
            }
        });
    }
    @Override
    protected void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    }
     private void setTextView(int resId, String text) {
        final TextView textView = (TextView) findViewById(resId);
        textView.setText(text);
        textView.setAlpha(.5f);
        textView.animate().alpha(1).start();
    }
     private void setPublisherThreadInfo(String threadInfo) {
        setTextView(R.id.publisherThread, threadInfo);
    }

    private void setSubscriberThreadInfo(String threadInfo) {
        setTextView(R.id.subscriberThread, threadInfo);
    }

首先是在onstart中注册onstop中解绑,且构造订阅和回调函数
在另一个fragment中发布函数

  case 2:
                        if (Math.random() > .5) {
                            new Thread("posting--002") {
                                @Override
                                public void run() {
                                    super.run();
                                    EventBus.getDefault().post(new PostingEvent(Thread.currentThread().toString()));
                                }
                            }.start();
                        } else {
                            EventBus.getDefault().post(new PostingEvent(Thread.currentThread().toString()));
                        }
                        break;

这里给了一个随机数,让他在普通线程和主线程中随机运行
看结果
在这里插入图片描述在这里插入图片描述 多试几次发现无论是在发布方是在主线程还是普通线程,订阅方都会和发布方在一个线程里面

@Main

@Subscribe(threadMode = ThreadMode.MAIN)
    public void onMainEvent(MainEvent event){
        final String threadinfo = Thread.currentThread().toString();
        setPublisherThreadInfo(event.threadinfo);
        setSubscriberThreadInfo(threadinfo);

    }

在Activity中的代码

   if (Math.random() > .5) {
                    new Thread("working") {
                        @Override
                        public void run() {
                            super.run();
                            EventBus.getDefault().post(new MainEvent(Thread.currentThread().toString()));
                        }
                    }.start();
                } else {
                    EventBus.getDefault().post(new MainEvent(Thread.currentThread().toString()));
                }
            }

在fragment中的代码

在这里插入图片描述
在这里插入图片描述
无论是在发布方是在主线程还是普通线程,订阅方都是在主线程中运行

MAIN_ORDERED

 @Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
    public void onMainOrderEvent(MainOrderEvent event){
        Log.d(TAG, "onMainOrderEvent:enter "+ SystemClock.uptimeMillis());
        final String threadinfo = Thread.currentThread().toString();
        setPublisherThreadInfo(event.threadinfo);
        setSubscriberThreadInfo(threadinfo);
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.d(TAG, "onMainOrderEvent:exit "+ SystemClock.uptimeMillis());

    }
 Log.d(TAG, "onMainOrderEvent:before "+ SystemClock.uptimeMillis());
        EventBus.getDefault().post(new MainOrderEvent(Thread.currentThread().toString()));
        Log.d(TAG, "onMainOrderEvent:after "+ SystemClock.uptimeMillis());

和Main一样都是在主线程中,不同的就是不需要等带订阅方完成订阅,发布方就可以继续自己的代码运行

同样的代码当使用Main时
在这里插入图片描述
当使用Mainoreder时
在这里插入图片描述

BackGround

 @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void onBackGroundEvent(final BackGroundEvent event){
        final String threadinfo = Thread.currentThread().toString();
        runOnUiThread(new Runnable() {//只要有可能不是在ui线程里的发送者,那么接收时就必须在ui线程里
            @Override
            public void run() {
                setPublisherThreadInfo(event.threadinfo);
                setSubscriberThreadInfo(threadinfo);
            }
        });

    }

订阅方不在主线程里运行

ASYNC

@Subscribe(threadMode = ThreadMode.ASYNC)
    public void onAsyncEvent(final AsyncEvent event){
        final String threadinfo = Thread.currentThread().toString();
        runOnUiThread(new Runnable() {//只要有可能不是在ui线程里的发送者,那么接收时就必须在ui线程里
            @Override
            public void run() {
                setPublisherThreadInfo(event.threadinfo);
                setSubscriberThreadInfo(threadinfo);
            }
        });

    }

同样不会在主线程里运行但是他是重写创建一个新的线程去完成订阅

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值