[英]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.