首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Firebase (Android)中连续读取值更改?

如何在Firebase (Android)中连续读取值更改?
EN

Stack Overflow用户
提问于 2018-09-08 16:33:24
回答 3查看 415关注 0票数 2

我用Firebase来玩多人游戏。一切都很好,除了我需要当一个玩家关闭应用程序(onStop()onDestroy()等)游戏结束。我有以下firebase结构:

代码语言:javascript
复制
"PVP" : {
    "active" : {
      "1536394217496" : {
        "didGameEnd" : true,
        "gameMaster" : {
          "didPlayerAnswer" : false,
          "name" : "stelios",
          "playerAnswerCorrect" : false,
          "score" : 2
        },
        "gameSlave" : {
          "didPlayerAnswer" : false,
          "name" : "anna",
          "playerAnswerCorrect" : false,
          "score" : 4
        },

我已经在onDestroyonDestroy等方法中更改了"didGameEnd“,运行良好。我的问题是,我需要捕获更改以运行最终游戏代码。我试了很多,但我做不到。下面是我的代码:

代码语言:javascript
复制
mGameFirebase = FirebaseDatabase.getInstance()
                .getReferenceFromUrl(Constants.FIREBASE_BASE_URL + Constants.FIREBASE_PVP + Constants.FIREBASE_GAME_ACTIVE_PATH + mGameWaitModel.getId());
public void ifGameEnds() {
        mGameFirebase.child("didGameEnd").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                Boolean isEnded = (Boolean) dataSnapshot.getValue();

                    if (isEnded == true) {
                        Intent intent = new Intent(getApplicationContext(), PvPWinningActivity.class);
                        Bundle dataSend = new Bundle();
                        dataSend.putString("Winning Text", winning_text);
                        dataSend.putInt("Your Score", your_Score);
                        dataSend.putInt("Opponent Score", opponent_score);
                        intent.putExtras(dataSend);
                        startActivity(intent);
                        finish();
                    }

                }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

据我所知,valueListener捕获了datachange,所以我不需要在这里做一些特殊的事情。我猜问题出在boolean的值上。我试着把它当做字符串,但没有成功。

Set value可以很好地工作,所以我想我是在正确的位置。

代码语言:javascript
复制
mGameFirebase.child("didGameEnd").setValue(true);

由于我是Firebase的新手,请对我的错误给予帮助!

在多次尝试之后,下面的代码

代码语言:javascript
复制
mGameFirebase.orderByChild("didGameEnd").equalTo(true).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

   // this will be triggered only when the value is true, so you can add the thing that you want to make happen, here only

                }

            }

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

            }
        });

有效,但即使值为FALSE也会触发。所以实际上它只是读取值,而不是做我需要的事情。

下面的代码

代码语言:javascript
复制
     mGameEnd =FirebaseDatabase.getInstance()
                        .getReferenceFromUrl(Constants.FIREBASE_BASE_URL + Constants.FIREBASE_TEST_PATH + Constants.FIREBASE_GAME_ACTIVE_PATH + mGameWaitModel.getId());
                mGameEnd.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {

                            boolean isEnded = dataSnapshot.getValue(Boolean.class);
if(isEnded) {
        //Your logic
    }


                    }

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

                }
            });

总是抛出Nullpoint异常。

EN

Stack Overflow用户

发布于 2018-09-11 23:58:47

为了便于将来参考,下面的代码可以工作:

代码语言:javascript
复制
// initialize the game state listener
        mGameEnd = FirebaseDatabase.getInstance()
                .getReferenceFromUrl(Constants.FIREBASE_BASE_URL + Constants.FIREBASE_TEST_PATH + Constants.FIREBASE_GAME_ACTIVE_PATH + mGameWaitModel.getId());
        mGameEnd.child("didGameEnd").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()) {
                    boolean isEnded = (Boolean) dataSnapshot.getValue();
                    if(isEnded){
                        if (isGameMaster()) {
                            your_Score = 0;
                            opponent_score = mGameModel.getGameSlave().getScore();
                            winning_text = "You Lost!";
                        }

                        if (!isGameMaster()) {
                            your_Score = 0;
                            opponent_score = mGameModel.getGameMaster().getScore();
                            winning_text = "You lost";
                        }
                        Intent intent = new Intent(getApplicationContext(), PvPWinningActivity.class);
                        Bundle dataSend = new Bundle();
                        dataSend.putString("Winning Text", winning_text);
                        dataSend.putInt("Your Score", your_Score);
                        dataSend.putInt("Opponent Score", opponent_score);
                        intent.putExtras(dataSend);
                        startActivity(intent);
                        finish();

                        Toast.makeText(getApplicationContext(), "Game Over", Toast.LENGTH_LONG).show();
                    }
                    else {
                        Toast.makeText(getApplicationContext(), "Keep Playing", Toast.LENGTH_LONG).show();
                    }
                }

非常感谢你的efford!

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52233505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档