Android EventBus 3.0使用

本文介绍如何在Android开发中使用EventBus进行高效的事件传递。通过实例演示了如何配置依赖、创建消息类、发送与接收事件等步骤,并解释了不同线程模式的区别及粘性事件的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对与开发android ,寻找开源框架并使用,是我们快速开发的途径。下边就带你走进广播的使用,第三方开源 EventBus
在as 上开发
一 在自己项目app build.gradle 加上

    compile 'org.greenrobot:eventbus:3.0.0'

二 自定义一个消息类,生成构造方法。这个就是发布的事件



/**
 * 消息事件类
 */
public class MessageEvent {

    private String message;

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

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

在需要接受广播消息的activity 的onCreate () 注册监听;在onDestroy()取消监听


        // 注册事件
        EventBus.getDefault().register(this);
        //取消事件注册
        EventBus.getDefault().unregister(this);

在需要发送广播的地方发送

// 发送消息
                EventBus.getDefault().post(new MessageEvent(message));
//message  为要发送的消息类容

在需要接受消息的地方接受消息 (这里的方法名可以自己改,但方法必须用 public 修饰, 否则不会接收到消息

@Subscribe
    public void onEventMainThread(MessageEvent messageEvent) {
       messageEvent.getMessage();
    }

下边是一个具体的小示例
有 前一个界面 跳转到 另一个界面,在第二 个界面点击按键发送一条广播到第一个界面。

第一 activity



public class BusActivity extends AppCompatActivity implements View.OnClickListener{

    Button breakBTN;
    TextView textTV;
    @Override
    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bus);
        breakBTN= (Button) findViewById(R.id.breakBTN);
        textTV= (TextView) findViewById(R.id.textTV);

        // 注册事件
        EventBus.getDefault().register(this);


        breakBTN.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.sendBTN :

               Intent intent=new Intent(BusActivity.this,ReceiveActivity.class);
                startActivity(intent);
            break;
        }
    }

// 接收消息的方法, 注意注解必须加上  必须用 public 修饰
    @Subscribe
    public void onEventMainThread(MessageEvent messageEvent) {
        textTV.setText("我是ReceiveActivity 发来的:" + messageEvent.getMessage());
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消事件注册
        EventBus.getDefault().unregister(this);
    }

}

第二activity

public class ReceiveActivity extends AppCompatActivity {
    Button itentBTN;
    EditText showTV;

    @Override
    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_receive);
        itentBTN= (Button) findViewById(R.id.itentBTN);
        showTV= (EditText) findViewById(R.id.showTV);

        itentBTN.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String message = showTV.getText().toString();
                if(TextUtils.isEmpty(message)) {
                    message = "默认消息";
                }
                // 发送消息
                EventBus.getDefault().post(new MessageEvent(message));

            }
        });
    }

}

消息事件类


public class MessageEvent {

    private String message;

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

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Sticky事件的使用
之前说的使用方法, 都是需要先注册(register), 再post,才能接受到事件;
如果你使用postSticky发送事件, 那么可以不需要先注册, 也能接受到事件.

首先,你可能需要声明一个方法:

//注意,和之前的方法一样,只是多了一个 sticky = true 的属性.
@Subscribe(threadMode = ThreadMode.MainThread, sticky = true)
public void onEvent(MsgEvent event){
}

其次, 你可以在没有register的情况下:(发送事件)

EventBus.getDefault().postSticky(new MsgEvent("With Sticky"));

之后, 再注册,这样就可以收到刚刚发送的事件了:

EventBus.getDefault().register(this);//注册之后,马上就能收到刚刚postSticky发送的事件

参数说明:

1》threadMode 表示方法在什么线程执行 (Android更新UI只能在主线程, 所以如果需要操作UI, 需要设置ThreadMode.MainThread)
2》 sticky 表示是否是一个粘性事件 (如果你使用postSticky发送一 个事件,那么需要设置为true才能接受到事件)
3》 priority 优先级 (如果有多个对象同时订阅了相同的事件, 那么优先级越高,会优先被调用.)


@Subscribe(threadMode = ThreadMode.MainThread, sticky = true, priority = 100)
public void onEvent(MsgEvent event){
}

注:注释后面可以添加3个参数 threadMode stick priority
ThreadMode.MAIN,事件接收函数执行在UI线程;

ThreadMode.POST,事件在哪个线程发布,接收函数就执行在哪个线程;默认

ThreadMode.ASYNC,事件执行在一个独立的异步线程中。强制在后台执行

ThreadMode.BackgroundThread,如果事件是在UI线程中发布出来的,那么就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么直接在该子线程中执行。

//如果由于事件的发布者是在子线程中,所以BACKGROUND与POSTING模式下订阅者与事件的发布者运行在同一个线程。

//而ASYNC模式下又重新开起一个线程来执行任务。Main模式则是在主线程中运行

priority:默认值为0。订阅了同一个事件的订阅函数,在ThreadMode值相同的前提下,收到事件的优先级,值越大优先级越高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值