EventBus学习笔记(三)

转发请注明地址:http://blog.csdn.net/qq_36145843/article/details/66476845(谢谢~!)

EventBus学习笔记(一)

EventBus学习笔记二

上一篇文章我们简单的介绍了一下EventBus的粘性事件。这篇文章我们来讲讲EventBus的优先级和事件取消。

优先级(Priorities)

在相同的传递线程(ThreadMode)中,较高优先级的订阅户将在其他优先级较低的订阅户之前接收事件。默认优先级为0。

定义优先级:

@Subscribe(priority = 1);
public void onEvent(MessageEvent event) {
    ...
}

接下来我们来做一个小demo来测试效果:

public class MainActivity extends AppCompatActivity {
    private int i = 0;
    private TextView mTextView;
    private Button mButton;

    @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);

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mTextView.setText("");
                EventBus.getDefault().post(new MessageEvent("测试"));
            }
        });
    }

    @Subscribe(priority = 2,threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {
        mTextView.append(event.message+"========>priority = 2   " + i++ +"\n");
    }

    @Subscribe(priority = 1,threadMode = ThreadMode.MAIN)
    public void onEvent(MessageEvent event) {
        mTextView.append(event.message+"========>priority = 1   " + i++ +"\n");
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent2(MessageEvent event) {
        mTextView.append(event.message+"========>priority = 0   " + i++ +"\n");
    }

    @Override
    protected void onStart() {
        super.onStart();
        //注册EventBus
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        //注销EventBus
        EventBus.getDefault().unregister(this);
    }
}

上述代码设置了三个订阅优先级,可以看到运行效果如下:
这里写图片描述

优先级还是比较好理解的。

事件取消
通过从订阅者的事件处理方法调用cancelEventDelivery (Object event ) 来取消事件传递过程 。任何其他活动传送将被取消,后续订阅者将不会收到活动。

@Subscribe
public void onEvent(MessageEvent event){
    // Process the event
    ...
    // Prevent delivery to other subscribers
    EventBus.getDefault().cancelEventDelivery(event) ;
}

现在我们将上述代码让第三个不接收事件:

public class MainActivity extends AppCompatActivity {
    private int i = 0;
    private TextView mTextView;
    private Button mButton;

    @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);

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mTextView.setText("");
                EventBus.getDefault().post(new MessageEvent("测试"));
            }
        });
    }

    @Subscribe(priority = 2)
    public void onMessageEvent(MessageEvent event) {
        mTextView.append(event.message+"========>priority = 2   " + i++ +"\n");
    }

    @Subscribe(priority = 1)
    public void onEvent(MessageEvent event) {
        mTextView.append(event.message+"========>priority = 1   " + i++ +"\n");
        EventBus.getDefault().cancelEventDelivery(event);
    }

    @Subscribe()
    public void onEvent2(MessageEvent event) {
        mTextView.append(event.message+"========>priority = 0   " + i++ +"\n");
    }

    @Override
    protected void onStart() {
        super.onStart();
        //注册EventBus
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        //注销EventBus
        EventBus.getDefault().unregister(this);
    }
}

运行效果如下图:
这里写图片描述

可以观察到我上述代码将threadMode去掉了,如果在 threadMode = ThreadMode.MAIN 中使用cancelEventDelivery(event) 的话将不能取消事件传递,因为cancelEventDelivery(event)方法只能在ThreadMode.POSTING中调用才有效。

好了,这篇文章到此结束。

源码地址 这里包括粘性事件的源码,和优先级的源码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值