我正在使用Firebase制作多人游戏。在下面的FindOpponentActivity中。该应用程序检查大厅是否已经存在,如果不存在,则创建一个大厅。如果已经存在,则玩家进入大厅,并且两个玩家都进入GameActivity,然后游戏开始。现在,创建大厅的玩家(如果愿意的话)是主持人,这个问题是当GameActivity启动时,它会在自身之上多次启动。另外,每当单击一个按钮时(即调用onDataChange),主机都会打开另一个GameActivty。播放器2不这样做。我在做什么错?

这是我的FindOpponentActivity:

package com.example.android.pitjesbak;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
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.ValueEventListener;

public class FindOpponentActivity extends AppCompatActivity {

    private FirebaseDatabase db;
    private DatabaseReference lobbies;
    private DatabaseReference users;
    private DatabaseReference lobby;

    private String lobbyKey;

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

    TextView status, findingOpponent;

    TextView cancel;

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


        db = FirebaseDatabase.getInstance();
        lobbies = db.getReference("lobbies");
        users = db.getReference("users");


        final Handler handler = new Handler();

        final Runnable findOpponent = new Runnable() {
            public void run() {
                OpponentExists();
            }
        };

        handler.postDelayed(findOpponent, 5000);

        cancel = findViewById(R.id.cancel);
        cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                lobbies.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        if(dataSnapshot.child(user.getUid()).exists()){
                            lobbies.child(user.getUid()).removeValue();
                        }else{
                            handler.removeCallbacks(findOpponent);
                        }
                        Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                        startActivity(intent);

                    }

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

                    }
                });
            }
        });











    }






    public void OpponentExists(){

        lobbies.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                if(dataSnapshot.exists()){
                    joinOpponent();
                }else{
                    createLobby();
                }
            }

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

            }
        });
    };

    public void joinOpponent(){
        lobbies.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot child: dataSnapshot.getChildren()){
                    if(!child.child("player2").exists()){
                        lobbyKey = child.getKey();
                        break;
                    }
                }
                if(lobbyKey == null){
                    createLobby();
                }else{
                    lobbies.child(lobbyKey).child("player2").setValue(user.getEmail());
                    Intent startGame = new Intent(getApplicationContext(), GameActivity.class);
                    startGame.putExtra("lobbyKey", lobbyKey);
                    startGame.putExtra("player", 2);
                    startActivity(startGame);
                    FindOpponentActivity.this.finish();
                }


            }

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

            }
        });
    }

    public void createLobby(){
        lobbies.child(user.getUid()).child("dice1").setValue(0);
        lobbies.child(user.getUid()).child("dice2").setValue(0);
        lobbies.child(user.getUid()).child("dice3").setValue(0);
        lobbies.child(user.getUid()).child("lives_p1").setValue(7);
        lobbies.child(user.getUid()).child("lives_p2").setValue(7);
        lobbies.child(user.getUid()).child("turn").setValue(1);
        lobbies.child(user.getUid()).child("has_stoeft").setValue(0);
        lobbies.child(user.getUid()).child("total_score_p1").setValue(0);
        lobbies.child(user.getUid()).child("total_score_p2").setValue(0);
        lobbies.child(user.getUid()).child("current_score_p1").setValue("0 points");
        lobbies.child(user.getUid()).child("current_score_p2").setValue("0 points");
        lobbies.child(user.getUid()).child("rolls_left").setValue(3);

        lobbies.child(user.getUid()).child("player1").setValue(user.getEmail());
        lobbyKey = user.getUid();

        lobby = lobbies.child(lobbyKey);


        lobby.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.child("player2").exists()){
                    Intent startGame = new Intent(getApplicationContext(), GameActivity.class);
                    startGame.putExtra("lobbyKey", lobbyKey);
                    startGame.putExtra("player", 1);
                    startActivity(startGame);
                    FindOpponentActivity.this.finish();
                }
            }

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

            }
        });

    };

}



这是我的GameActivity:

package com.example.android.pitjesbak;

import android.content.Intent;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;

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.ValueEventListener;

import java.util.Random;

import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;

public class GameActivity extends AppCompatActivity {

    Button roll, stop;

    TextView dice1, dice2, dice3, stoefen, player, other, current_score_player, current_score_other, lives_player, lives_other;

    CheckBox[] checks = new CheckBox[3];

    private int[] dice = new int[3];

    int min = 1;
    int max = 6;

    private int[] dice_scores = new int[3];
    String dice_total;

    boolean sn_4, sn_5, sn_6;

    boolean has_stoeft = false;

    int rolls_left;

    int turn = 1;

    int playing;

    String popup;


    String lobbyKey;

    FirebaseDatabase db;
    DatabaseReference lobby;

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

        lobbyKey= getIntent().getStringExtra("lobbyKey");

        db = FirebaseDatabase.getInstance();
        lobby = db.getReference("lobbies").child(lobbyKey);

        roll = findViewById(R.id.roll);
        stop = findViewById((R.id.stop));
        roll.setEnabled(false);

        stoefen = findViewById(R.id.stoefen);
        stoefen.setVisibility(INVISIBLE);

        roll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                roll();
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stop();
            }
        });


        dice1 = findViewById(R.id.dice1);
        dice2 = findViewById(R.id.dice2);
        dice3 = findViewById(R.id.dice3);

        checks[0] = (CheckBox) findViewById(R.id.check1);
        checks[1] = (CheckBox) findViewById(R.id.check2);
        checks[2] = (CheckBox) findViewById(R.id.check3);

        player = findViewById(R.id.player);
        current_score_player = findViewById(R.id.current_score_player);
        lives_player = findViewById(R.id.lives_player);

        other = findViewById(R.id.other);
        current_score_other = findViewById(R.id.current_score_other);
        lives_other = findViewById(R.id.lives_other);




            lobby.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
                    int playerCheck = getIntent().getIntExtra("player", 1);
                    if(playerCheck == 1) {
                        player.setText(dataSnapshot.child("player1").getValue(String.class));
                        current_score_player.setText(dataSnapshot.child("current_score_p1").getValue(String.class));
                        lives_player.setText(dataSnapshot.child("lives_p1").getValue(Long.class).toString());

                        other.setText(dataSnapshot.child("player2").getValue(String.class));
                        current_score_other.setText(dataSnapshot.child("current_score_p2").getValue(String.class));
                        lives_other.setText(dataSnapshot.child("lives_p2").getValue(Long.class).toString());
                    }else{
                        player.setText(dataSnapshot.child("player2").getValue(String.class));
                        current_score_player.setText(dataSnapshot.child("current_score_p2").getValue(String.class));
                        lives_player.setText(dataSnapshot.child("lives_p2").getValue(Long.class).toString());

                        other.setText(dataSnapshot.child("player1").getValue(String.class));
                        current_score_other.setText(dataSnapshot.child("current_score_p1").getValue(String.class));
                        lives_other.setText(dataSnapshot.child("lives_p1").getValue(Long.class).toString());
                    }

                    turn = dataSnapshot.child("turn").getValue(int.class);
                    if(turn%2 == 0){
                        playing = 2;
                    }else{
                        playing = 1;
                    }

                    if(playing == playerCheck){
                        roll.setEnabled(true);
                    }else{
                        roll.setEnabled(false);
                        stop.setEnabled(false);
                    }


                    dice1.setText(dataSnapshot.child("dice1").getValue(Long.class).toString());
                    dice2.setText(dataSnapshot.child("dice2").getValue(Long.class).toString());
                    dice3.setText(dataSnapshot.child("dice3").getValue(Long.class).toString());

                    rolls_left = dataSnapshot.child("rolls_left").getValue(int.class);


                    if(rolls_left == 3){
                        for (int i = 0; i < 3; i++) {
                            checks[i].setEnabled(false);
                        }
                        stop.setEnabled(false);
                    }
                    if (rolls_left < 3) {

                        if (rolls_left == 2) {
                            stoefen.setVisibility(VISIBLE);
                        } else {
                            stoefen.setVisibility(INVISIBLE);
                        }

                        if(rolls_left == 0){
                            roll.setEnabled(false);
                        }

                        stop.setEnabled(true);
                        for (int i = 0; i < 3; i++) {
                            checks[i].setEnabled(true);
                        }
                    }



                    if(dataSnapshot.child("round_winner").exists()) {
                        if (dataSnapshot.child("winner").exists()) {
                            Intent intent = new Intent(getApplicationContext(), FinishActivity.class);
                            intent.putExtra("lobbyKey", lobbyKey);
                            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(intent);
                            GameActivity.this.finish();
                        } else {
                            lobby.child("current_score_p1").setValue("0 points");
                            lobby.child("current_score_p2").setValue("0 points");
                            lobby.child("round_winner").removeValue();
                            lobby.child("has_stoeft").setValue(false);
                            lobby.child("rolls_left").setValue(3);
                            lobby.child("turn").setValue(1);
                            lobby.child("readyup").removeValue();
                            Intent intent = new Intent(getApplicationContext(), GameActivity.class);
                            intent.putExtra("player", playerCheck);
                            intent.putExtra("lobbyKey", lobbyKey);
                            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            startActivity(intent);
                            GameActivity.this.finish();
                        }
                    }




                }

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

                }
            });


    }




    public void roll(){
        if (rolls_left > 0) {
            Toast.makeText(GameActivity.this, rolls_left + " rolls left", Toast.LENGTH_SHORT).show();
        } else if (rolls_left == 0) {
            Toast.makeText(GameActivity.this, "no rolls left", Toast.LENGTH_SHORT).show();
            roll.setEnabled(false);
        }


        sn_4 = false;
        sn_5 = false;
        sn_6 = false;

        // generate numbers
        for (int i = 0; i < 3; i++) {
            if (checks[i].isChecked() == false) {
                Random r = new Random();
                int random = r.nextInt(((max - min) + 1)) + min;
                dice[i] = random;
            }else{
                if(i == 0){
                    dice[0] = Integer.parseInt(dice1.getText().toString());
                }else if(i == 1){
                    dice[1] = Integer.parseInt(dice2.getText().toString());
                }else if(i == 2){
                    dice[2] = Integer.parseInt(dice3.getText().toString());
                }
            }
        }

        lobby.child("dice1").setValue(dice[0]);
        lobby.child("dice2").setValue(dice[1]);
        lobby.child("dice3").setValue(dice[2]);



        // Set scores
        for (int i = 0; i < 3; i++) {
            if (dice[i] == 4) {
                sn_4 = true;
            }

            if (dice[i] == 5) {
                sn_5 = true;
            }

            if (dice[i] == 6) {
                sn_6 = true;
            }
        }

        if (dice[0] == dice[1] && dice[1] == dice[2]) {
            if (dice[0] == 1) {
                dice_total = "3 azen";
            } else {
                dice_total = "zand";
            }
        } else if (sn_4 == true && sn_5 == true && sn_6 == true) {
            dice_total = "soixante-neuf";
        } else {
            for (int i = 0; i < 3; i++) {
                if (dice[i] == 1) {
                    dice_scores[i] = 100;
                } else if (dice[i] == 6) {
                    dice_scores[i] = 60;
                } else {
                    dice_scores[i] = dice[i];
                }
            }

            dice_total = (dice_scores[0] + dice_scores[1] + dice_scores[2]) + " points";

        }
        if(playing == 1){
            lobby.child("current_score_p1").setValue(dice_total);
        }else{
            lobby.child("current_score_p2").setValue(dice_total);
        }

        if(rolls_left > 0){
            rolls_left -= 1;
        }else{
            roll.setEnabled(false);
        }
        lobby.child("rolls_left").setValue(rolls_left);

    };

    public void stop(){
        if(stoefen.getVisibility() == VISIBLE){
            has_stoeft = true;
            lobby.child("has_stoeft").setValue(true);
        }

        if(turn == 1){
            lobby.child("turn").setValue(2);
            lobby.child("rolls_left").setValue(3);
        }else if(turn == 2){
            int winner = 0;
            int worth = 0;
            switch (current_score_player.getText().toString()) {
                case "3 azen":
                    if (current_score_other.getText().toString().equals("3 azen")) {
                        winner = 0;
                        worth = 0;
                    } else {
                        winner = 2;
                        worth = Integer.parseInt(lives_player.getText().toString());
                    }
                    break;
                case "soixante-neuf":
                    if (current_score_other.getText().toString().equals("3 azen")) {
                        winner = 1;
                        worth = Integer.parseInt(lives_other.getText().toString());
                    } else if (current_score_other.getText().toString().equals("soixante-neuf")) {
                        winner = 0;
                        worth = 0;
                    } else {
                        winner = 2;
                        worth = 3;
                    }
                    break;
                case "zand":
                    if (current_score_other.getText().toString().equals("3 azen") || current_score_other.getText().toString().equals("soixante-neuf")) {
                        winner = 1;
                        if(current_score_other.getText().toString().equals("3 azen")){
                            worth = Integer.parseInt(lives_other.getText().toString());
                        }else{
                            worth = 3;
                        }
                    } else if (current_score_other.getText().toString().equals("zand")) {
                        winner = 0;
                        worth = 0;
                    } else {
                        winner = 2;
                        worth = 2;
                    }
                    break;
                default:
                    if (current_score_other.getText().toString().equals("3 azen") || current_score_other.getText().toString().equals("soixante-neuf") || current_score_other.getText().toString().equals("zand")) {
                        winner = 1;
                        if(current_score_other.getText().toString().equals("3 azen")){
                            worth = Integer.parseInt(lives_other.getText().toString());
                        }else if(current_score_other.getText().toString().equals("soixante-neuf")){
                            worth = 3;
                        }else if(current_score_other.getText().toString().equals("zand")){
                            worth = 2;
                        }
                    } else {
                        String[] p2_parts = current_score_player.getText().toString().split(" ");
                        int score_p2 = Integer.parseInt(p2_parts[0]);
                        String[] p1_parts = current_score_other.getText().toString().split(" ");
                        int score_p1 = Integer.parseInt(p1_parts[0]);
                        if (score_p1 > score_p2) {
                            winner = 1;
                            worth = 1;
                        } else if (score_p1 < score_p2) {
                            winner = 2;
                            worth = 1;
                        } else {
                            winner = 0;
                            worth = 0;
                        }
                    }
            }



            int lives_p1 = Integer.parseInt(lives_other.getText().toString());
            int lives_p2 = Integer.parseInt(lives_player.getText().toString());

             if( winner == 1){
                lives_p1 -= worth;
                if(has_stoeft){
                    lives_p1 --;
                }
                lobby.child("lives_p1").setValue(lives_p1);
            }else if(winner == 2){
                lives_p2 -= worth;
                if(has_stoeft){
                    lives_p1 += 2;
                }
                lobby.child("lives_p2").setValue(lives_p2);
                lobby.child("lives_p1").setValue(lives_p1);
            }

            if(lives_p1 <= 0){
                lobby.child("winner").setValue(1);
            }
            if(lives_p2 <= 0){
                lobby.child("winner").setValue(2);
            }

            lobby.child("round_winner").setValue(winner);




        }
    }
}

最佳答案

您是否曾尝试删除在收到事件之后或活动拆卸期间(onStop / onDestroy)在FindOpponentsActivity中添加/附加的事件侦听器?我的猜测是它仍在连接并接收事件。

07-27 16:34