30/09/2018, 19:34

So sánh giữa Observer và Broadcast Receiver

Bà con cho mình hỏi sự khác biệt giữa Observer và Broadcast Receiver trong Android ?
Mình thấy 2 cái này cũng tương tự nhau trong quá trình nhận và gởi broadcast.

Quân viết 21:40 ngày 30/09/2018

Broadcast có thể hoạt động ngay cả khi app chưa chạy vì nó đăng kí với hdh, method onReceive của đối tượng broadcast luôn được hệ thống gọi ở main thread (không tính tự bạn gọi đâu nhé). Observer chỉ là nói chung về 1 design pattern dạng thông báo sự kiện thôi

viết 21:44 ngày 30/09/2018

Như vậy ý bạn nói là BroadcastReceiver chính là 1 dạng hiện thực hóa của mô hình Observer

Đến từ Na Mếc viết 21:47 ngày 30/09/2018

Mình đính chính lại tí nhé :
Từ Android 3.0 , các broadcast receiver đăng kí ở manifest chỉ dc active khi app đc chạy ít nhất 1 lần. Nếu chỉ cài đặt mà chưa sử dụng thì receiver vẫn chưa dc active bạn nhé .

Bà con cho mình hỏi sự khác biệt giữa Observer và Broadcast Receiver trong Android ?Mình thấy 2 cái này cũng tương tự nhau trong quá trình nhận và gởi broadcast.

Làm sao để so sánh khi mà Broadcast Receiver là một thành phần trong Android được triển khai dựa trên pattern Observer?

Phan Hoàng viết 21:42 ngày 30/09/2018

Đúng là không thể so sánh được vì mô hình Broadcast Receiver được triển khai dựa trên pattern Observer. Tuy nhiên, ở một nghĩa hẹp thì có thể có 1 số điểm sau:

  • Khi bạn triển khai pattern Observer, thường là do bạn muốn tách biệt 2 task: phần worker và phần director. Director chỉ đạo làm 1 task mà không cần biết worker nào sẽ đảm nhận. Worker sẽ được notify việc phù hợp khi đăng ký vào một kênh việc (thằng notify sẽ là thằng deliver cái message từ Director sang cho Worker). Do đó khi nó Observer pattern thường người ta ám chỉ cách decoupling module trong 1 app.
  • Còn Broadcast Receiver hoạt động như mô hình Event-Bus vậy, và ở cấp độ giữa các app với nhau. Một thằng service của hệ điều hành sẽ gọi intent tương ứng khi xẩy ra một sự kiện nào đó. Nếu mà dùng Observer phía trên, bạn sẽ phải chạy nhiều service để listen trigger, còn theo BR thì bạn chỉ cần 1 service cho tất cả (tiết kiệm bộ nhớ hơn rất nhiều)

Có 1 số ưu nhược điểm của 2 cái này:

  • Observer truyền thống:
  • Ưu: dễ implement, sử dụng typed-safe giữa các module được, truyền binary object ngon
  • Nhược: chỉ dùng với quan hệ 1-1, chứ quan hệ 1-n thì phải code thêm (hoặc dùng Observable của android),…
  • BR của android:
  • Ưu: 1-n vô tư, thậm chí 1-0, không cần biết mặt mũi sender và worker luôn.
  • Nhược: nhét dữ liệu vào intent rồi tranfer đòi hỏi tốn time (marshall/unmarshall), phải kiểm soát register/unregister vào Broadcaster, …

Ngoài ra, Android cũng support kiểu mô hình này trong nội bộ app qua LocalBroadcastManager (đỡ phải dùng Observer truyền thống). Tuy nhiên, tùy context mà bạn chọn dùng hay không dùng (cần tight decoupling thì dùng Observer truyền thống, còn loose decoupling thì dùng BroadcastReceiver)

Võ Anh Kiệt viết 21:34 ngày 30/09/2018

Thế có so sánh thêm EventBus vào được không nhỉ, vì mình nghĩ no cũng là 1 Pattern của Observer

Bài liên quan
0