Tính bền vững hoạt động
Ứng dụng khách Firebase giữ bản sao tất cả dữ liệu bạn đang tích cực nghe trong bộ nhớ. Khi người nghe cuối ngắt kết nối, dữ liệu sẽ bị xóa khỏi bộ nhớ.
Nếu bạn kích hoạt kiên trì đĩa trong một ứng dụng căn cứ hỏa lực Android với:
Firebase.getDefaultConfig().setPersistenceEnabled(true);
Các căn cứ hỏa lực khách hàng sẽ giữ một bản sao cục bộ (trên đĩa) của tất cả các dữ liệu mà ứng dụng gần đây đã lắng nghe.
gì xảy ra khi bạn đính kèm một người biết lắng nghe
Giả sử bạn có sau ValueEventListener
:
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
System.out.println(snapshot.getValue());
}
@Override
public void onCancelled(FirebaseError firebaseError) {
// No-op
}
};
Khi bạn thêm một ValueEventListener
đến một vị trí:
ref.addValueEventListener(listener);
// OR
ref.addListenerForSingleValueEvent(listener);
Nếu giá trị của vị trí nằm trong bộ nhớ cache trên đĩa cục bộ, ứng dụng khách Firebase sẽ gọi ngay lập tức onDataChange()
cho giá trị đó từ bộ nhớ cache cục bộ. Nếu sau đó sẽ bắt đầu kiểm tra với máy chủ, để yêu cầu bất kỳ cập nhật nào cho giá trị. Sau đó, có thể sẽ gọi lại onDataChange()
nếu có thay đổi dữ liệu trên máy chủ kể từ lần cuối cùng được thêm vào bộ nhớ cache.
gì xảy ra khi bạn sử dụng addListenerForSingleValueEvent
Khi bạn thêm một sự kiện nghe giá trị duy nhất với cùng vị trí:
ref.addListenerForSingleValueEvent(listener);
Các khách hàng căn cứ hỏa lực sẽ (như trong tình hình trước) ngay lập tức gọi onDataChange()
cho giá trị từ bộ đệm đĩa cục bộ. Nó sẽ không phải gọi thêm onDataChange()
bất kỳ lần nào nữa, ngay cả khi giá trị trên máy chủ hóa ra khác. Lưu ý rằng dữ liệu cập nhật vẫn sẽ được yêu cầu và trả lại cho các yêu cầu tiếp theo.
này được bao phủ trước đó trong How does Firebase sync work, with shared data?
Giải pháp và cách giải quyết
Giải pháp tốt nhất là sử dụng addValueEventListener()
, thay vì một người biết lắng nghe sự kiện duy nhất có giá trị. Trình nghe giá trị thông thường sẽ nhận được cả sự kiện cục bộ tức thời và cập nhật tiềm năng từ máy chủ.
Giải pháp thay thế bạn cũng có thể call keepSynced(true)
trên các vị trí mà bạn sử dụng trình xử lý sự kiện có giá trị một lần. Điều này đảm bảo rằng dữ liệu được cập nhật bất cứ khi nào nó thay đổi, giúp cải thiện đáng kể khả năng trình xử lý sự kiện giá trị đơn của bạn sẽ thấy giá trị hiện tại.
Cảm ơn bạn. Tôi hiểu ngay từ câu trả lời của liên kết .. –
Cảm ơn bạn đã minh họa hoàn hảo. Nhưng keepSynced (true) và addValueEventListener sẽ luôn giữ kết nối mở. Ngược lại với keepSynced (false) và addListenerForSingleValueEvent sẽ cho phép firebase ngắt kết nối sau một thời gian. Làm thế nào tôi có thể bắt buộc cập nhật thủ công một lần? –
Một hành vi bất tiện, nó làm cho thử nghiệm hầu như không thể. –