EventBus学习笔记(三)

来源:互联网 发布:手机延时软件 编辑:程序博客网 时间:2024/05/31 06:21

转发请注明地址: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 ) 来取消事件传递过程 。任何其他活动传送将被取消,后续订阅者将不会收到活动。

@Subscribepublic 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
原创粉丝点击