這篇我們將實作之前提到的監聽器,以偵測是否有資料變動並抓取
為了達成雙方玩家的資訊的交互,我們需要實時監測資料庫中的哪些值有被修改,雙方玩家都會去監聽資料庫,若當中移動方輪到白方,則黑方的行動都會被關閉,白方開啟,反之亦然
private void listenConversations(){
// 創建資料庫監聽器
database.collection("RoomData")
.whereEqualTo("RoomNumber", roomNumber)
.addSnapshotListener(eventListener);
}
private final EventListener<QuerySnapshot> eventListener = (value, error) -> {
if (error != null){
return;
}
if (value != null){
for (DocumentChange documentChange : value.getDocumentChanges()){
if (documentChange.getType() == DocumentChange.Type.MODIFIED){
// 只要有資料變動,即抓取資料
dbp.getData(roomNumber);
// 如果是黑方的移動時間,將自己的移動按鈕關閉
if(documentChange.getDocument().getString("MoveState").equals("black")){
chessmanEnable = false;
}
// 如果是白方的移動時間,將自己的移動按鈕開啟
else{
chessmanEnable = true;
}
if(!gameMode.equals("ai")){
// 如果對方未上線,跳出對話框
if(documentChange.getDocument().getBoolean("Player2OnlineState") == false){
dialogData.showBackDialog("對方玩家未上線");
}
// 如果對方已上線,對話框消失
else{
dialogData.dismissBackDialog();
}
}
// 如果兩方都不在線上,則刪除此房間並結束頁面
if(documentChange.getDocument().getBoolean("Player1OnlineState") == false
&& documentChange.getDocument().getBoolean("Player2OnlineState") == false){
dbp.deleteData(roomKey);
finish();
}
// 如果WinPlayer為白方則白方勝利
if(documentChange.getDocument().getString("WinPlayer").equals("white")){
dialogData.showBackDialog("白方勝利");
}
// 如果WinPlayer為黑方則黑方勝利
else if(documentChange.getDocument().getString("WinPlayer").equals("black")){
dialogData.showBackDialog("黑方勝利");
}
}
}
}
};
這樣我們就成功創建一個監聽器,並設定資料庫只要資料有變動就抓取資料,以達到更新變數及介面的功能