You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android双人问答游戏回合管理问题:次玩家连接后页面关闭

双人问答游戏Firebase协作问题求助

我是Android开发新手,正在开发一款双人问答游戏。目前遇到的问题是:当第二名玩家加入第一名玩家已等待的游戏时,第二名玩家的游戏页面会关闭,而第一名玩家的页面正常运行。我通过创建Firebase的"turn"节点引用来管理玩家回合,并在setQuiz()方法中获取当前回合玩家的用户名,恳请各位开发者提供技术帮助。

package com.example.genialone;

import android.app.ProgressDialog;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;

import com.bumptech.glide.Glide;
import com.example.genialone.data.RealtimeDatabase;
import com.example.genialone.model.TurnManager;
import com.example.genialone.model.Utente;
import com.example.genialone.preference.PreferencesManager;
import com.example.genialone.util.RandomCategory;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.MutableData;
import com.google.firebase.database.Query;
import com.google.firebase.database.Transaction;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import de.hdodenhof.circleimageview.CircleImageView;

public class GiocoActivity extends BaseActivity {

    private Button next;
    private PreferencesManager preferencesManager;

    private TextView opponent;
    private CircleImageView imageOpponent;

    private TextView player;
    private CircleImageView imagePlayer;
    private ProgressDialog progressDialog;

    private FirebaseDatabase database = FirebaseDatabase.getInstance();

    private TextView question;
    private Button option1, option2, option3, option4;
    private String rightAnswer;
    private String player1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gioco);

        player = findViewById(R.id.player);
        imagePlayer = findViewById(R.id.imagePlayer);

        opponent = findViewById(R.id.opponent);
        imageOpponent = findViewById(R.id.imageOpponent);

        question = findViewById(R.id.question);

        option1 = findViewById(R.id.option1);
        option2 = findViewById(R.id.option2);
        option3 = findViewById(R.id.option3);
        option4 = findViewById(R.id.option4);

        preferencesManager = new PreferencesManager(GiocoActivity.this);
        player1 = preferencesManager.getUsername();

        next = findViewById(R.id.continuaButton);
        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // next turn
            }
        });

        progressDialog = new ProgressDialog(GiocoActivity.this);
        progressDialog.setCancelable(false);
        progressDialog.setMessage("In cerca di un avversario...");
        progressDialog.show();

        startGame();
    }

    public void loadProfilePhoto(String user, CircleImageView imageProfilePhoto) {
        DatabaseReference imageRef = database.getReference("Utenti").child(user);

        imageRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                String imageUrl = dataSnapshot.child("imagineProfilo").getValue(String.class);
                Glide.with(GiocoActivity.this).load(imageUrl)
                        .placeholder(com.firebase.ui.database.R.drawable.common_google_signin_btn_icon_dark)
                        .circleCrop()
                        .error(com.firebase.ui.database.R.drawable.common_google_signin_btn_icon_dark_normal)
                        .into(imageProfilePhoto);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                // Gestione degli errori
            }
        });
    }

    private void startGame() {
        player.setText(player1);
        loadProfilePhoto(player1, imagePlayer);
        DatabaseReference connectionRef = database.getReference("connections");
        Query availableConnections = connectionRef.orderByChild("player2").equalTo(null);

        availableConnections.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if(snapshot.exists()){
                    for (DataSnapshot gameSnapshot : snapshot.getChildren()) {
                        String connectionId = gameSnapshot.getKey();
                        connectionRef.child(connectionId).child("player2").setValue(player1);
                        join(connectionId);
                        break;
                    }
                } else {
                    DatabaseReference newRef = database.getReference("connections").push();
                    String connectionId = newRef.getKey();
                    assignPlayersToGame(connectionId, player1);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

    private void join(String connectionId) {
        DatabaseReference connectionRef = database.getReference("connections").child(connectionId);

        connectionRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String usernameOpponent = snapshot.child("player1").getValue(String.class);
                showInfoOpponent(usernameOpponent);
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

    private String playerTurn;
    private String turnKey;

    private void assignPlayersToGame(String connectionId, String username) {
        DatabaseReference connectionRef = database.getReference("connections").child(connectionId);
        DatabaseReference turnRef = database.getReference("turn");
        turnKey = turnRef.push().getKey();

        Map<String, Object> playerData = new HashMap<>();
        playerData.put("player1", username);
        connectionRef.updateChildren(playerData);
        turnRef.updateChildren(playerData);

        connectionRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                String usernameOpponent = snapshot.child("player2").getValue(String.class);

                if (usernameOpponent != null) {
                    showInfoOpponent(usernameOpponent);
                    if (progressDialog.isShowing()) {
                        progressDialog.dismiss();
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

    private void showInfoOpponent(String username) {
        DatabaseReference usersRef = database.getReference("Utenti");

        usersRef.child(username).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                Utente opponentInfo = snapshot.getValue(Utente.class);
                opponent.setText(opponentInfo.getNomeUtente()); // username
                loadProfilePhoto(opponentInfo.getNomeUtente(), imageOpponent); // image profile
                loadPage();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

    private void setQuiz(String questionD, ArrayList<String> options, String answer) {
        DatabaseReference turnRef = database.getReference("turn").child(turnKey);

        turnRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                playerTurn = snapshot.child("player1").getValue(String.class);
                if (player1.equals(playerTurn)) {
                    question.setText(questionD);
                    rightAnswer = answer;
                    Button[] buttons = {option1, option2, option3, option4};

                    for (int i = 0; i < options.size(); i++) {
                        buttons[i].setText(options.get(i));
                    }
                    next.setVisibility(View.VISIBLE);
                } else {
                    progressDialog = new ProgressDialog(GiocoActivity.this);
                    progressDialog.setCancelable(false);
                    progressDialog.setMessage("Wait...");
                    progressDialog.show();
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                // Gestione degli errori
            }
        });
    }

    private void loadPage() {
        DatabaseReference quizRef = database.getReference("Quiz");
        String category = RandomCategory.getCategory();

        quizRef.child(category).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                int idQuestion = RandomCategory.getQuestion();
                String quest = snapshot.child("Domande").child(String.valueOf(idQuestion)).getValue(String.class);
                ArrayList<String> options = new ArrayList<>();
                for (DataSnapshot opt : snapshot.child("Opzioni").child(String.valueOf(idQuestion)).getChildren()) {
                    String currentOpt = opt.getValue(String.class);
                    options.add(currentOpt);
                }
                String rightA = snapshot.child("Risposta").child(String.valueOf(idQuestion)).getValue(String.class);
                setQuiz(quest, options, rightA);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

}

内容的提问来源于stack exchange,提问作者routerking2802

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:10:28