Trong ứng dụng của tôi, tôi chỉ đơn giản là cố gắng để lấy một đoạn đọc từ cơ sở dữ liệu Firebase
của tôi bằng cách thêm một ListenerForSingleValueEvent
trong đoạn mã sau:Android căn cứ hỏa lực - "onDataChange" Và "onCancelled" Không Được gọi mà không có kết nối Internet
myRef.child("passages").child(passageNum).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("ON DATA CHANGE");
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("DATABASE ERROR");
FirebaseErrorHandler.handleDatabaseError(databaseError.getCode(), ReadingActivity.this);
}
});
Nó hoạt động hoàn toàn tốt khi có kết nối internet. Tuy nhiên, khi tôi cố ý tắt kết nối internet, không phải onDataChange
cũng không phải là onCancelled
đang được gọi. Điều này là rất bực bội vì hai trong số các mã lỗi trong databaseError.getCode()
phải làm với các vấn đề kết nối mạng.
Nếu tôi không thể nhận được dữ liệu này do không có internet, tôi muốn ít nhất cho người dùng biết rằng thay vì để người nghe này treo màn hình liên tục tải. Có cách nào để giải quyết này? Tôi có phải chỉ cần sử dụng API REST của Firebase's
không? Ít nhất với các yêu cầu mạng RESTful, chúng cho bạn biết nếu kết nối thất bại hay không.
Đây là giải pháp nhưng không phải là giải pháp mong muốn. Tôi có thể kiểm tra tính khả dụng của Internet trước khi thực hiện bất kỳ truy vấn nào đến cơ sở dữ liệu firebase, nhưng điều đó sẽ không tốt vì tôi muốn giữ ứng dụng của tôi 100% ngoại tuyến. Giả sử, khi tôi khởi động ứng dụng lần đầu tiên mà không cần kết nối internet, cơ sở dữ liệu firebase không có dữ liệu và bị kẹt trong cuộc gọi lại. Sự cố sẽ biến mất trong lần chạy tiếp theo nếu kết nối internet được cung cấp ít nhất lần đầu tiên. Làm thế nào để giải quyết kịch bản này? Nó sẽ thực sự tốt hơn nếu Firebase cung cấp thông tin này trong onCancelled() ít nhất. –
@AritraRoy cách bạn xử lý vấn đề u = này? u đã tìm thấy một giải pháp cho điều này? –
Điều này thực sự không may là tôi phải kiểm tra cờ trước khi tôi chạy bất kỳ truy vấn nào. Đối với trình nghe sự kiện ** giá trị đơn **, Firebase sẽ trả về lỗi nếu không nhận được giá trị. Các hành vi hiện tại chỉ đẩy tất cả sự phức tạp này lên cho các ứng dụng để đối phó với. –