8

Theo LiveData documentation:Làm cách nào để xóa giá trị được lưu trữ LiveData?

Lớp LiveData cung cấp những ưu điểm sau:

...

Luôn cập nhật dữ liệu: Nếu một vòng đời bắt đầu một lần nữa (như một hoạt động trở lại để bắt đầu trạng thái từ ngăn xếp lại), nó sẽ nhận được dữ liệu vị trí mới nhất (nếu nó chưa có).

Nhưng đôi khi tôi không cần tính năng này.

Ví dụ, tôi đã sau LiveData trong ViewModel và Observer trong Hoạt động:

//LiveData 
val showDialogLiveData = MutableLiveData<String>() 

//Activity 
viewModel.showMessageLiveData.observe(this, android.arch.lifecycle.Observer { message -> 
     AlertDialog.Builder(this) 
       .setMessage(message) 
       .setPositiveButton("OK") { _, _ -> } 
       .show() 
    }) 

Bây giờ sau mỗi lần xoay thoại cũ sẽ xuất hiện.

Có cách nào để xóa giá trị được lưu trữ sau khi được xử lý hoặc sử dụng không đúng LiveData không?

+2

điều này liên quan đến: https://stackoverflow.com/questions/44146081/show-dialog-from-viewmodel-in-android-mvvm-architecture –

+0

Có liên quan đến vấn đề dữ liệu trực tiếp không? Hoạt động sẽ được tái tạo mỗi khi bạn xoay bất kể bạn sử dụng LiveData hay không. Vấn đề sẽ tiếp tục ngay cả khi bạn xóa nó. –

+0

@LongRanger nó có thể được giải quyết bằng cách xóa thư được lưu trữ trong LiveData sau khi hộp thoại được hiển thị, vì vậy hoạt động mới sẽ không nhận được nó. Cùng một nguyên tắc được sử dụng trên [OneExecutionStateStrategy] của Moxy (https://github.com/Arello-Mobile/Moxy/wiki/View-commands-state-strategy#existing-strategies) – Kamer358

Trả lời

12

Phản hồi của Alex trong các nhận xét là tôi nghĩ chính xác những gì bạn đang tìm kiếm. Có mã mẫu cho một lớp có tên là SingleLiveEvent. Mục đích của lớp học này được mô tả là:

Có thể quan sát vòng đời chỉ gửi các cập nhật mới sau khi đăng ký , được sử dụng cho các sự kiện như thông báo điều hướng và Snackbar.

Điều này tránh được sự cố thường gặp với sự kiện: về thay đổi cấu hình (như xoay vòng) bản cập nhật có thể được phát ra nếu người quan sát đang hoạt động. LiveData này chỉ thực hiện cuộc gọi nếu có cuộc gọi rõ ràng tới setValue() hoặc gọi().

Các vấn đề liên quan