2015-06-05 23 views
8

Tôi đang sử dụng phụ trợ Firebase cho ứng dụng Android của mình. Tôi muốn xây dựng hệ thống hiện diện của người dùng cho cuộc trò chuyện của mình. Với mục đích này, tôi đã lấy mẫu từ căn cứ hỏa lực Hướng dẫnFirebase: khi onDisconnect kích hoạt sự kiện?

final Firebase myConnectionsRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/users/joe/connections"); 

// stores the timestamp of my last disconnect (the last time I was seen online) 
final Firebase lastOnlineRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/users/joe/lastOnline"); 

final Firebase connectedRef = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/.info/connected"); 
connectedRef.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
    boolean connected = snapshot.getValue(Boolean.class); 
    if (connected) { 
     // add this device to my connections list 
     // this value could contain info about the device or a timestamp too 
     Firebase con = myConnectionsRef.push(); 
     con.setValue(Boolean.TRUE); 

     // when this device disconnects, remove it 
     con.onDisconnect().removeValue(); 

     // when I disconnect, update the last time I was seen online 
     lastOnlineRef.onDisconnect().setValue(ServerValue.TIMESTAMP); 
    } 
    } 

    @Override 
    public void onCancelled(FirebaseError error) { 
    System.err.println("Listener was cancelled at .info/connected"); 
    } 
}); 

Vấn đề là tôi không biết khi nào onDisconnect sự kiện sẽ bị sa thải ?!

Mỗi khi tôi mở ứng dụng, tôi viết TRUE cho nút "người dùng/joe/kết nối" nhưng khi tôi đóng ứng dụng, không có gì sẽ xảy ra. Khi tôi tắt WIFI, thông số boolean cũng sẽ không bị xóa. onDisconnect-event chỉ được kích hoạt khi tôi dừng ứng dụng của mình hoặc cài đặt lại ứng dụng này hoặc khi nào tôi không thể xác định được.

Vì vậy, khi tôi hiểu đúng, tôi phải xử lý các sự kiện thủ công như vậy:

1) đóng ứng dụng của tôi;

2) tắt WiFi;

3) có thể một cái gì đó khác

để tạo tính năng Hiện diện trong ứng dụng của tôi? Nhưng sau đó khi có onDisconnect-event để được kích hoạt?

Trả lời

13

Có hai trường hợp có thể xảy ra khi client và server được ngắt kết nối:

  1. khách hàng một cách rõ ràng ngắt kết nối từ máy chủ
  2. khách hàng đơn giản biến mất

Khi bạn tắt ứng dụng , bạn đang kích hoạt ngắt kết nối rõ ràng. Trong trường hợp đó máy khách sẽ gửi một tín hiệu đến máy chủ mà nó đang ngắt kết nối và máy chủ sẽ thực hiện ngay cuộc gọi lại onDisconnect.

Khi bạn tắt wifi, ứng dụng của bạn sẽ không có cơ hội cho máy chủ biết rằng nó đang ngắt kết nối. Trong trường hợp đó, onDisconnect sẽ kích hoạt khi máy chủ phát hiện thấy máy khách đã biến mất. Quá trình này có thể mất một vài phút, tùy thuộc vào cách thời gian chờ cho ổ cắm được định cấu hình. Vì vậy, trong trường hợp đó bạn chỉ cần có một chút kiên nhẫn hơn.

+0

Tôi không hiểu. Khi người dùng nhấn nút BACK và đóng tất cả các hoạt động, onDisconnect() sẽ không kích hoạt. Nhưng trong tình huống này, người dùng nên cân nhắc nhé, phải không? – iForests

+1

@iForests Tôi nghĩ rằng 'Khi người dùng nhấn nút BACK và đóng tất cả hoạt động' sẽ được xử lý trong _ActivityLifecycleCallbacks_ – rookieDeveloper

+0

@Frank_van_Puffelen mất bao lâu để máy chủ phát hiện ra rằng máy khách đã biến mất? và điều này là không thực tế cho máy chủ để mất vài phút vì đi offline nên ngay lập tức kích hoạt các chức năng liên quan trong máy chủ Firebase để người dùng hiểu được tình trạng của nhau. –

0

Khi người dùng thoát khỏi ứng dụng, bạn có thể gọi admin.database().goOffline() để ngắt kết nối rõ ràng khỏi cơ sở dữ liệu, sẽ kích hoạt gọi lại onDisconnect. Khi người dùng quay lại ứng dụng, chỉ cần gọi admin.database().goOnline() để kết nối lại với Firebase.

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