Triển khai EventBus tùy chỉnh cho giao tiếp giữa các thành phần Android

Trong ứng dụng Android, việc trao đổi dữ liệu giữa Activity, FragmentService thường gặp nhiều trở ngại do giới hạn về phạm vi sống (lifecycle) và mô hình phân tách trách nhiệm. Các cách tiếp cận truyền thống như broadcast receiver hay Handler/Looper đòi hỏi cấu hình thủ công, dễ gây rò rỉ bộ nhớ và làm tăng độ phức tạp của mã nguồn. Một giải pháp thay thế hiệu quả là áp dụng mô hình *event bus* — một cơ chế đăng ký–phát hành (publish-subscribe), trong đó các thành phần không cần biết đến nhau trực tiếp. Thay vì gọi phương thức trực tiếp hoặc truyền Intent qua hệ thống, người gửi chỉ cần đẩy một sự kiện vào bus; các thành phần đã đăng ký lắng nghe sự kiện đó sẽ được thông báo tự động. Dưới đây là cách triển khai một hệ thống event bus đơn giản nhưng đầy đủ chức năng, sử dụng thư viện SimpleEventBus:
  1. Nhập thư viện và khai báo phụ thuộc
    Thêm tệp simple_eventbus.jar vào thư mục libs/, sau đó khai báo trong build.gradle (nếu dùng Gradle):
    implementation files('libs/simple_eventbus.jar')
    Đồng thời import hai lớp cốt lõi tại nơi cần sử dụng:
    import org.simple.eventbus.EventBus;
    import org.simple.eventbus.Subscriber;
  2. Đăng ký và hủy đăng ký vòng đời
    Trong cả MainScreenActivity (người nhận) và SecondaryActivity (người phát), đảm bảo đăng ký với bus khi bắt đầu và hủy khi kết thúc:
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        EventBus.getDefault().register(this);
    }
    
    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }
    Việc này ngăn chặn lỗi truy cập đối tượng đã bị huỷ và đảm bảo tính an toàn luồng.
  3. Gửi sự kiện từ Activity thứ hai
    Trong SecondaryActivity, gắn sự kiện click cho nút:
    findViewById(R.id.action_trigger).setOnClickListener(v -> {
        counter++;
        statusView.setText("Lần nhấn thứ: " + counter);
        EventBus.getDefault().post(new ClickEvent(counter), "user_interaction");
    });
    Lưu ý: Đối tượng ClickEvent là một lớp dữ liệu thuần (POJO) chứa thông tin hữu ích — khác với ví dụ gốc dùng Object() rỗng — giúp mở rộng khả năng truyền dữ liệu trong tương lai.
  4. Xử lý sự kiện tại Activity chính
    Khai báo phương thức xử lý trong MainScreenActivity với chú thích @Subscriber:
    @Subscriber(tag = "user_interaction")
    public void onUserActionReceived(ClickEvent event) {
        displayCount.setText("Tổng số lần nhấn từ màn hình khác: " + event.getCount());
        Log.d("EventBusDemo", "Nhận sự kiện với giá trị: " + event.getCount());
    }
    Phương thức này sẽ được gọi tự động mỗi khi có sự kiện mang tag "user_interaction" được đăng tải — không cần gọi thủ công hay kiểm tra điều kiện.
  5. Kết quả thực thi
    Khi người dùng chuyển sang SecondaryActivity, nhấn nút nhiều lần, rồi quay lại MainScreenActivity, giao diện sẽ phản ánh đúng số lần tương tác đã được đồng bộ hoá qua bus — minh hoạ rõ ràng cơ chế liên lạc phi đồng bộ, không ràng buộc chặt chẽ giữa các thành phần.

Thẻ: Android eventbus simpleeventbus lifecycle-aware pubsub

Đăng vào ngày 22 tháng 5 lúc 06:24