簡體   English   中英

Firebase返回意外值

[英]Firebase returning unexpected values

在下文中,我將嘗試解釋使用AS從Firebase數據庫檢索數據時遇到的問題。

應用程序的結構:當前包括兩個活動, 主菜單聊天 活動聊天顯示消息,用戶名和圖標(用戶類型,即admin和online-status)

為了在聊天室中獲取在線狀態,對於每條消息,用戶名都存儲在ArrayList中,並傳遞給第二個數據庫引用(第一個引用是針對消息)的,該數據庫引用遍歷所有名稱並相應地檢索時間戳。

問題:雖然按預期運行,但我注意到某些功能無法正常運行,尤其是在應用程序首次啟動時 ,當online-status顯示為完全隨機時 為了解決此問題,需要退出聊天活動,返回主菜單並重新進入聊天室。 之后,一切都將正確顯示。

我注意到消息和用戶名完全按預期返回,時間戳雖然是隨機的,但導致對所有消息的在線狀態顯示為在線,或者上半線顯示為離線,下半部顯示為在線。

在下面,我包括代碼片段和屏幕截圖。 如果您有關於如何改進代碼的建議或任何有用的鏈接,請告訴我,我仍然是初學者:)

public void chatLinstenerFirebase() {
    chatMessageCap();
    playerNames.clear();
    playerOnlineResult.clear();
    // Path holding the current administration information in the Database
    mDatabase = FirebaseDatabase.getInstance().getReference("/chat/messages");

    mDatabase.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            execChat.loadUrl("https://*****/exec32014472?uid=" + UUID);

            String value = dataSnapshot.getValue(String.class);
            String key = dataSnapshot.getKey();

            // Example for keyParts[] = 1519214361812@user@player
            String keyParts[] = key.split("@");
            ArrayList<String> nameParts = new ArrayList<>();
            // Storing username
            nameParts.add(keyParts[2]);
            for(String res : nameParts) {
                res = keyParts[2];
                // Storing username for second database Reference
                playerNames.add(res);
            }
            // Storing player type i.e user/mod/admin
            String playerType = keyParts[1];

            if(playerType.equals("dev")) {
                playerTypeIcon.add(R.drawable.devicon);
            }
            if(playerType.equals("user")) {
                playerTypeIcon.add(0);
            }
            if(playerType.equals("mod")) {
                playerTypeIcon.add(R.drawable.modicon);
            }
            if(playerType.equals("admin")) {
                playerTypeIcon.add(R.drawable.adminicon);
            }

            // Displaying time when message was sent
            long timestamp = Long.parseLong(keyParts[0]);

            Date localTime = new Date(timestamp);
            String format = "HH:mm";
            SimpleDateFormat sdf =  new SimpleDateFormat(format);
            sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
            String formattedDate = sdf.format(localTime);

            timestampResult.add(formattedDate);
            messageResult.add(value);

            // Getting player timestamps to append online/offline icon
            if (playerNames.size() >= message_count) {
                // Iterate through all players in the chat-room
                for (String n : playerNames) {
                    bDatabase = FirebaseDatabase.getInstance().getReference("/lastonline/" + n);

                    bDatabase.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {

                            timestampOfPlayer = (long) dataSnapshot.getValue();
                            long currentTimeStamp = System.currentTimeMillis();

                            if (timestampOfPlayer + 300000 >= currentTimeStamp) {
                                playerOnlineResult.add(R.drawable.playeronline);
                            }
                            if (timestampOfPlayer + 300000 < currentTimeStamp) {
                                playerOnlineResult.add(R.drawable.playeroffline);
                            }

                            if (playerOnlineResult.size() >= message_count) {
                                result();
                            }
                        }
                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                        }
                    });
                }
            }
        }

        ...
        ...

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            playerNames.remove(0);
            messageResult.remove(0);
            timestampResult.remove(0);
            playerTypeIcon.remove(0);
            playerOnlineResult.remove(0);
        }
        ...
        ...
    });

}
public void result(){
        adapter = new ChatAdapter(this, playerNames, messageResult, timestampResult, playerTypeIcon, playerOnlineResult);
        messagecontainer.setAdapter(adapter);
        adapter.notifyDataSetChanged();
}

屏幕截圖:左側在首次啟動時顯示錯誤的在線狀態,右側按預期工作

問題:雖然按預期運行,但我注意到某些功能無法正常運行,尤其是在應用程序首次啟動時,在線狀態完全隨機顯示。 為了解決此問題,需要退出聊天活動,返回主菜單並重新進入聊天室。 之后,一切都正確顯示

我認為您的“主菜單”中的代碼更新狀態為在線或在聊天室中,因此您在恢復申請時需要再次更新代碼狀態

暫無
暫無

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

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