簡體   English   中英

Firebase 連接檢查 Android 中的在線離線狀態

[英]Firebase connection check online offline status in Android

如果用戶同時關閉 wi-fi、3g、4g 等並反向(沒有互聯網連接)。 Firebase 數據庫名稱子連接:(true/false) 因此,當互聯網連接、wi-fi、3g、4g 等關閉或丟失時,用戶處於離線狀態,因此無法找到他。

記住兩個場景:之前和之后。 如果用戶在其他用戶搜索他之前離線,那么他不會顯示在列表結果中,如果用戶在其他用戶搜索他之后離線,那么它會在用戶上顯示 NO MORE AVAILABLE 圖標

請有人幫助我解決這個問題。

為了解決這個問題,您可以在 Firebase 實時數據庫中創建一個新節點來保存所有在線用戶,這樣當用戶打開應用程序時,您將立即將他的 id 添加到這個新創建的節點中。 然后,如果要檢查用戶是否在線,只需檢查列表中是否存在他的id。

您還可以為數據庫中的每個用戶添加一個名為isOnline的新屬性,然后相應地更新它。

為此,我建議您使用 Firebase 的內置onDisconnect()方法。 它使您能夠預定義在客戶端斷開連接時將立即發生的操作。

請參閱Firebase 文檔

您還可以檢測用戶的連接狀態。 對於許多與在線狀態相關的功能,了解您的應用何時在線或離線非常有用。 Firebase 實時數據庫在/.info/connected提供了一個特殊位置,每次 Firebase 實時數據庫客戶端的連接狀態更改時都會更新該位置。 以下是官方文檔中的一個示例:

DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
    connectedRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            boolean connected = snapshot.getValue(Boolean.class);
            if (connected) {
                System.out.println("connected");
            } else {
                System.out.println("not connected");
            }
        }

        @Override
        public void onCancelled(DatabaseError error) {
            System.err.println("Listener was cancelled");
        }
});

雖然這已經晚了一年多,但還是要澄清一下混亂。 Alex 的問題想要實現一個實時聊天場景,在該場景中,每個用戶都可以在自己的終端或設備上查看每個人的在線狀態。 一個簡單的解決方案是創建一個節點,所有用戶都會在其中注入他們的在線狀態。 例如

    //say your realtime database has the child `online_statuses`
    DatabaseReference online_status_all_users = FirebaseDatabase.getInstance().getReference().child("online_statuses");

    //on each user's device when connected they should indicate e.g. `linker` should tell everyone he's snooping around
    online_status_all_users.child("@linker").setValue("online");
    //also when he's not doing any snooping or if snooping goes bad he should also tell
    online_status_all_users.child("@linker").onDisconnect().setValue("offline")

因此,如果另一個用戶,比如mario從他的一端檢查linker ,他可以確定如果linker在線,一些窺探仍在進行中,即

    DatabaseReference online_status_all_users = FirebaseDatabase.getInstance().getReference().child("online_statuses");
    online_status_all_users.child("@linker").addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
        String snooping_status = dataSnapshot.getValue(String.class);
        //mario should decide what to do with linker's snooping status here e.g.
         if(snooping_status.contentEquals("online")){
            //tell linker to stop doing sh*t
         }else{
            //tell linker to do a lot of sh****t
         }     
      }

      @Override
      public void onCancelled(DatabaseError databaseError) {

      }
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM