EventBus简单使用

来源:互联网 发布:mac os 未能验证更新 编辑:程序博客网 时间:2024/05/22 06:39

简介:

EventBus是基于观察者/订阅者模型
这里写图片描述

1.订阅者订阅自己希望的事件类型,发布者将事件发送到EventBus后,由EventBus决定将事件交给哪个订阅者处理
2.使用EventBus,EventBus最常用的几个方法原型:
* EventBus.getDefault().register(Object subscriber);
* EventBus.getDefault().unregister(Object subscriber);
* EventBus.getDefault().post(Object event);
第一个为订阅者订阅事件,一旦在类中调用这个方法,EventBus就会遍历类中的方法,将声明为处理事件的方法存起来,等到有订阅者订阅的事件时,就会调用相应的方法处理
第二个为取消注册订阅事件
第三个为发送一个事件到EventBus

注:本文例子中EventBus均为3.X

简单例子

需求为点击第二个页面的按钮,改变第一个页面的文本显示
首先需要定义事件类型,其实也是一个类:

package com.example.eventbussimple;/** * Created by user on 2016/8/4 004. */public class EventBean {    public EventBean(String name) {        this.name = name;    }    public String name;}

第一页代码如下:

package com.example.eventbussimple;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.TextView;import org.greenrobot.eventbus.EventBus;import org.greenrobot.eventbus.Subscribe;import org.greenrobot.eventbus.ThreadMode;public class MainActivity extends AppCompatActivity {    private TextView textView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        EventBus.getDefault().register(this);//订阅事件        textView = (TextView) findViewById(R.id.id_text1);        findViewById(R.id.id_button1).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                startActivity(new Intent(MainActivity.this, Main2Activity.class));            }        });    }    @Override    protected void onDestroy() {        super.onDestroy();        EventBus.getDefault().unregister(this);//取消订阅事件    }    //处理事件方法,在3.0以后都需要使用注解来表明这个 方法可以处理EventBus事件    //threadMode会在下面解释    @Subscribe(threadMode = ThreadMode.MAIN)    public void handleMessage(EventBean event) {        textView.setText(event.name);    }}

第二页代码为

package com.example.eventbussimple;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import org.greenrobot.eventbus.EventBus;public class Main2Activity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main2);        Button button = (Button) findViewById(R.id.id_button);        if (button != null) {        //点击按钮发送事件            button.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    EventBus.getDefault().post(new EventBean("xiaowj"));                }            });        }    }}

至此,点击第二页按钮,第一页的文本就能变为xiaowj

EventBus的ThreadMode

细心的小伙伴在上面的例子中应该注意到了threadMode这个东西,简单来说就是指明处理事件的方法要在哪种线程中执行
ThreadMode有四种枚举类型,下面会一一解释

  • ThreadMode.POSTING 事件处理函数在事件发送线程中执行。需要尽快处理事件,这种方式是同步调用处理函数,如果长时间处理事件会导致阻塞事件发送线程运行
  • ThreadMode.MAIN 事件处理函数在主线程中执行(UI线程)。这个不用说,事件处理函数需要尽快处理事件,不然会导致程序无响应
  • ThreadMode.BACKGROUND 如果发送事件线程是主线程,就新开线程处理这个事件,如果发送事件线程不是主线程,就在发送事件的线程中执行事件处理函数。这个模式也是需要尽快处理事件,如果发送事件线程不是主线程,会同步调用事件处理函数,如果没有快速处理事件, 同样会导致事件发送线程阻塞
  • ThreadMode.ASYNC 新开线程处理事件,如果事件需要长时间处理,建议选用这种模式开发
    各位小伙伴可以根据上面描述选择合适的ThreadMode处理事件

题外话,下周会更新EventBus源码分析

0 0