Android 之 页面间通信(Eventbus)

本文介绍了如何在Android应用中使用 EventBus 进行数据分发和接收,包括注册与注销事件监听器、发送数据示例以及关键的@Subscribe注解的使用。重点展示了如何通过 EventBus 实现组件间的高效通信。

使用 ​​EventBus 3​​(Android 平台)的完整示例,涵盖事件定义、注册/注销、发送和接收事件,以及四种线程模式的使用场景

1. 添加依赖

在 build.gradle 中添加依赖:

dependencies {
    implementation 'org.greenrobot:eventbus:3.3.1' // 使用最新版本
}

 2. 定义事件类

public class MessageEvent {
    private String message;
    public MessageEvent(String message) {
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
}

3. 发送事件的 Activity

public class SenderActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sender);

        Button btnSend = findViewById(R.id.btn_send);
        btnSend.setOnClickListener(v -> {
            // 发送事件
            EventBus.getDefault().post(new MessageEvent("Hello from Sender!"));
            finish(); // 关闭当前页面
        });
    }
}

4. 接收事件的 Activity

public class ReceiverActivity extends AppCompatActivity {
    private TextView tvMessage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_receiver);
        tvMessage = findViewById(R.id.tv_message);
    }

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

    @Override
    protected void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this); // 注销EventBus(防内存泄漏)
    }

    // 主线程处理(可更新UI)
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEventMain(MessageEvent event) {
        tvMessage.setText("MAIN: " + event.getMessage());
    }

    // 后台线程处理(避免阻塞UI)
    @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void onMessageEventBackground(MessageEvent event) {
        Log.d("EventBus", "BACKGROUND: " + event.getMessage());
    }

    // 异步线程处理(独立于UI和发布线程)
    @Subscribe(threadMode = ThreadMode.ASYNC)
    public void onMessageEventAsync(MessageEvent event) {
        // 模拟耗时操作
        SystemClock.sleep(2000);
        Log.d("EventBus", "ASYNC: " + event.getMessage());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值