关于EventBus用法总结

简而言之,EventBus是一个事件发布和订阅的框架。

使用方法:

1、Android studio导入:compile'org.greenrobot:eventbus:3.0.0'

2、定义事件类型:

public class MessageEvent {
    public final String message;

    public MessageEvent(String message) {
        this.message = message;
    }
}

3、订阅者:

@Subscribe
public void onMessageEvent(MessageEvent event){
    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
@Subscribe
public void handleSomethingElse(SomeOtherEvent event){
    doSomethingWith(event);
}
4、注册及解绑EventBus

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
   EventBus.getDefault().unregister(this);
    super.onStop();
}
5、发送事件

EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
OK,这就是EventBus的简单用法。对于上述代码,需要注意的是:发送事件的类中不需要进行 注册及解绑EventBus,但在订阅者所在的类中则需要进行注册及解绑EventBus。EventBus中事件的发送及订阅是通过事件类型,即本例中的MessageEvent,进行匹配的。

详细讲解:

EventBus包含4个ThreadModeThreadMode.POSTING、ThreadMode.MAIN、ThreadMode.BACKGROUND、ThreadMode.ASYNC

例:

@Subscribe(threadMode = ThreadMode.POSTING) 
public void onMessage(MessageEvent event) {
    log(event.message);
}
ThreadMode.POSTING:默认使用该模式,表示该方法会在当前发布事件的线程执行

ThreadMode.MAIN:表示会在UI线程中执行

ThreadMode.BACKGROUND:若当前线程非UI线程则在当前线程中执行,否则加入后台任务队列,使用线程池调用

ThreadMode.ASYNC:加入后台任务队列,使用线程池调用

Sticky Events的用法

简单来说,若之前事件使用postSticky进行发布且执行过,则当sticky为true的订阅者再次订阅时,会去stickyEvents去查找事件,然后立即去post执行。

例:

EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));
@Subscribe(sticky = true)
    public void onEvent(MessageEvent event) {
        textField.setText(event.message);
    }
若必要也可以移除之前发布过的 postSticky,例:

MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
    EventBus.getDefault().removeStickyEvent(stickyEvent);
}
Subscriber Priorities(优先级)

这个没什么好说的,只需要知道优先级越高越优先执行,默认的优先级为0,使用例:

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

到这就学完了。

转载请注明出处:http://blog.csdn.net/wl1769127285/article/details/51065015

本文参考:http://greenrobot.org/eventbus/







  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用和介绍了基于Vue实现发布订阅模式的方式,即使用事件总线(EventBus)来进行组件之间的通信。首先,在一个模块中创建事件总线,并将其导出,以便其他模块可以使用或监听它。然后,在需要订阅事件的地方,使用`eventBus.$on`方法来监听事件,指定事件名称和回调函数。当事件被触发时,回调函数将会被执行。在需要发布事件的地方,使用`eventBus.$emit`方法来触发事件,指定事件名称和传递的参数。 关于Vuex的使用举例,Vuex是Vue的官方状态管理库,它提供了一种集中式存储管理应用的方式。和事件总线类似,Vuex也可以用于组件之间的通信。不过,Vuex更适合用于管理应用的共享状态和数据。 举例如下,假设有一个应用需要管理一个名为`count`的状态,可以使用Vuex来实现: - 首先,在创建Vue实例之前,引入并使用Vuex插件。可以在`main.js`文件中进行如下配置: ``` import Vue from 'vue' import Vuex from 'vuex' import App from './App.vue' Vue.use(Vuex) const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment(state, payload) { state.count += payload.num } } }) new Vue({ store, render: h => h(App) }).$mount('#app') ``` - 然后,在需要使用`count`状态的组件中,可以使用`mapState`和`mapMutations`辅助函数来简化代码。例如,在`showNum.vue`组件中: ```vue <template> <div> 计算和: {{ count }} <button @click="incrementCount">增加</button> </div> </template> <script> import { mapState, mapMutations } from 'vuex' export default { computed: { ...mapState(['count']) }, methods: { ...mapMutations(['incrementCount']) } } </script> ``` - 最后,在组件中使用`count`状态和`incrementCount`方法即可。`count`可以通过计算属性的方式获取,`incrementCount`可以通过方法来触发对应的mutation。 总结来说,事件总线(EventBus)适合用于简单的组件之间通信,而Vuex适合用于管理应用的共享状态和数据。在具体的应用场景中,可以根据需要选择适合的方式来进行组件之间的通信和状态管理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vuex使用详细说明及实例](https://blog.csdn.net/to_the_Future/article/details/122809337)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Vue中组件之间8种通信方式](https://blog.csdn.net/liushihao_/article/details/119617378)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值