MutableLiveData được mở rộng từ LiveData. Các phương thức được bảo vệ của LiveData chỉ có thể được giải quyết bởi lớp tự hoặc lớp con. Vì vậy, trong trường hợp này MutableLiveData là một lớp con của LiveData có thể truy cập các phương thức được bảo vệ này.
Điều bạn muốn làm là quan sát một phiên bản và xem liệu có bất kỳ thay đổi nào không. Nhưng đồng thời bạn không muốn bất kỳ "người ngoài" nào thay đổi trường hợp mà bạn đang quan sát. Theo một nghĩa nào đó, điều này tạo ra một vấn đề, vì bạn muốn có một đối tượng có thể thay đổi được, để cập nhật bất kỳ trạng thái mới nào và không thể thay đổi, để đảm bảo không ai không nên cập nhật trường hợp này. Hai tính năng này xung đột với nhau nhưng có thể được giải quyết bằng cách tạo thêm một lớp.
Vì vậy, những gì bạn làm là mở rộng lớp của bạn, LiveData, với một lớp có thể truy cập các phương thức của nó. Lớp con, trong trường hợp này là MutableLiveData, có thể truy cập các phương thức được bảo vệ của lớp cha (/ super) của nó.
Bây giờ bạn bắt đầu tạo các phiên bản và tạo phiên bản quan sát của MutableLiveData. Đồng thời, bạn tạo một cá thể LiveData đề cập đến cùng một cá thể này. Vì MutableLiveData mở rộng LiveData, bất kỳ cá thể MutableLiveData nào đều là đối tượng LiveData và do đó có thể được tham chiếu bởi một biến LiveData.
Bây giờ thủ thuật gần như đã hoàn thành. Bạn chỉ hiển thị cá thể LiveData, không ai có thể sử dụng các phương thức được bảo vệ của nó, cũng như không thể truyền nó đến siêu nó (có thể tại thời điểm biên dịch, nhưng nó sẽ không chạy: Lỗi RunTime). Và bạn giữ cá thể lớp con thực tế ở chế độ riêng tư, vì vậy nó chỉ có thể được thay đổi bởi những người sở hữu cá thể đó bằng cách sử dụng các phương thức của cá thể đó.
//create instance of the sub class and keep this private
private val _name: MutableLiveData<String> = MutableLiveData<String>()
//create an instance of the super class referring to the same instance
val name: LiveData<String> = _name
name.value.observe(.....)
Bây giờ siêu lớp sẽ thông báo khi có bất kỳ thay đổi nào được áp dụng.
_name.postValue(...)
Blockquote Nói chung, một hình thức kế thừa như vậy (tăng khả năng hiển thị của một số phương pháp là thay đổi duy nhất) có phải là một thực tiễn nổi tiếng không và một số tình huống mà nó có thể hữu ích là gì (giả sử chúng ta có quyền truy cập vào tất cả mã)?
Vâng, nó khá nổi tiếng và điều này được mô tả ở trên là một kịch bản phổ biến. Loại bỏ mô hình quan sát và chỉ cần đặt nó trong một biểu mẫu set / get cũng sẽ được nhiều lợi ích từ nó. Tùy thuộc vào nơi bạn thực hiện nó, không có quy tắc vàng cuối cùng.
LiveData
là không thay đổi, kể từ khi khách hàng không có thể thay đổi trạng thái nội bộ, do đó thread-safe