Hỏi về cách hoạt động của các eventListener

Chào mọi người, mình có chút thắc mắc về các hàm lắng nghe sự kiện trên các ngôn ngữ. Về nguyên lí hoạt động của chúng là như thế nào.
Ví dụ như một đoạn chương trình trong android, hàm addEvent() chứa các event listener cho các view sẽ được tương tác. Làm sao để các bộ lắng nghe có thể duy trì được trong suôt thời gian chạy của chương trình. Xin cảm ơn mọi người.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    addControls();
    addEvents();
}

private void addEvents() {

}

private void addControls() {
    txtA = (EditText) findViewById(R.id.txtA);
    // ...
}

Cái đoạn “lắng nghe” đó nó nằm trong vòng lặp thôi.
Bạn không thấy cơ bản là do vòng lặp đó đã bị ẩn đi.

2 Likes

Nếu nó trong vòng lặp thì làm sao những công việc khác có thể chạy trong khi nó đang lắng nghe ạ ?
Hay nó dùng đa luồng ạ :confused:

1 Like

Không hẳn là vòng lặp. Theo như link này hoặc link này có thể nó là do thiết bị truyền vào cho hệ điều hành, hệ điều hành truyền vào cho ứng

1 Like

Thực ra nó là các callback function.
Trước tiên bạn phải xác định các event mà bạn cần lắng nghe sau đó gọi function của bạn từ event đó.
Nếu bạn chưa biết về callback function thì nó là thế này.
Đầu tiên define 1 interface Nếu ở class nào muốn lắng nghe Event này thì đều phải implement phương thức của nó. Để sau này khi co event thì nó sẽ gọi về.
vd . Ở Activity bạn có 1 event nào đó OnclickButton chẳng hạn.
Tương tự như observer pattern in C++
Còn nếu bạn muốn addEvents() thì Sever( nơi bạn sản xuất ra event) phải có cơ chế cho đăng ký . Lúc đó bạn pass object của bạn vào và như 1 client của server.
Android làm tương tự implement sẵn 1 số các event và với interface tên là EventListener
https://developer.android.com/reference/java/util/EventListener

1 Like

Bên trong vòng lặp đó vừa lắng nghe vừa thực thi công việc. Vòng lặp đó là vòng lặp chính trong hàm main,

Đúng là OS sẽ gửi các mesage và param liên quan tới ứng dụng. Vòng lặp chính sẽ “chộp” lấy các message này. Sau đó tuỳ loại tin nhắn và param sẽ thực thi công việc trong hàm WndProc.
Đấy là trên Windows còn Linux thì chịu :smile:

1 Like

Cảm ơn mọi người đã giúp đỡ, nhưng em vẫn chưa thông cho lắm :v :v:

Câu của bạn thực sự khó trả lời lắm.

Vì Android có nó nhiều tầng (layer) xử lý khác nhau. Mỗi layer thì nó dựa layer tầng dưới, đưa ra design và API khác nhau.

Layer cao nhất trong Event Handling chính là observer pattern bằng cách sử dụng listener gắn vào view. Các tutorial hay course về Android đa số sẽ hướng dẫn ở mức này là xong. Tuy nhiên thực sự bên trong không có hiện thực observer pattern. Đó chỉ là API giả cho cơ chế gesture recognizer của layer dưới thôi.

Mình bên iOS nên mình nắm rõ Event Handling của iOS, đi từ hardware lên tận View. Bên Android thì mình không rành nên không chém bừa.

3 Likes

Android cũng tương tự thôi bạn, các app android (mobile) hay các fw GUI nói chung đều có chung 1 cơ chế gọi là event loop. Khi start 1 ứng dụng thì sẽ fork 1 process, process này sẽ sinh ra 1 thread gọi là main thread. Main thread này sẽ lặp vô hạn lấy các message từ message queue ra và xử lí. Tùy thuộc vào message mà sẽ pass đến các bộ xử lí đã đăng kí tương ứng. Trong đó có 1 số bộ xử lí mặc định gồm có: broadcast listener, IPC call, view system,… Ngoài ra còn có custom processing do dev tự định nghĩa.
Do tất cả các xử lí UI đều được xử lí trên cùng 1 thread nên Android developer đều được khuyến cáo là không xử lí quá nhiều trên main thread vì sẽ làm treo ứng dụng

Ví dụ: khi người dùng touch vào màn hình thì android system sẽ pass 1 event mang thông tin về touch event vào message main queue của ứng dụng, touch event này sẽ được pass sang view system của ứng dụng ở lần loop tiếp theo, view system sẽ pass down event xuống các child view để xác định user muốn click vào view nào. Khi gặp view thích hợp thì view này sẽ gọi click listener đã được dev set vào view đó. Ngoài các event do hệ thống sinh ra thì dev cũng có thể send message vào main message queue bằng class Handler. Đây là cách mà có thể thực hiện 1 thay đổi UI từ thread khác main thread trong Android

Ảnh mô tả sơ lược về ý tưởng của cơ chế hoạt động của android event system. Ảnh dưới mình đã lược bỏ phần lớn những thành phần trung gian, chỉ giữ lại những thành phần nêu bật được ý tưởng hoạt động thôi. Thực tế thì phức tạp hơn thế nhiều

6 Likes

Đã hiểu, cảm ơn anh nhiều ạ

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?