2016-08-18 17 views
9

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.

Trả lời

5

Firebase tách dòng chảy của các sự kiện dữ liệu (chẳng hạn như onDataChange()) từ những thứ khác có thể xảy ra. Nó sẽ chỉ gọi onCancelled khi có lý do phía máy chủ để làm như vậy (hiện tại chỉ khi khách hàng không được phép truy cập dữ liệu). Không có lý do gì để hủy người nghe, chỉ vì không có kết nối mạng.

Điều bạn có vẻ đang tìm kiếm là một cách để phát hiện xem có kết nối mạng (không phải là tác vụ cụ thể của Firebase) hay không hoặc người dùng có được kết nối với cơ sở dữ liệu Firebase không. Sau đó, bạn có thể thực hiện bằng cách đính kèm một người nghe đến .info/connected, một giá trị boolean ngầm định là true khi bạn kết nối với backbase cơ sở dữ liệu Firebase và là false nếu không. Xem phần trong số document on detecting connection state để biết chi tiết đầy đủ.

+5

Đâ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. –

+0

@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? –

+3

Đ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. –

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