首页 > 解决方案 > 如何连续读取 Firebase (Android) 中的值变化?

问题描述

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

"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”工作正常。我的问题是我需要捕获更改以运行残局代码。我尝试了很多,但我无法管理它。这是我的代码:

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价值上。我尝试将其作为字符串但没有运气。

设置值工作正常,所以我猜我指向正确的地方

mGameFirebase.child("didGameEnd").setValue(true);

感谢任何帮助,因为我是 Firebase 的新手!

经过多次尝试以下代码

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,它也会触发。所以实际上它只是读取值,而不是做我需要的。

以下代码

     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 异常。

标签: javaandroidfirebasefirebase-realtime-database

解决方案


didGameEnd要将属性的值设置为falseto true,您需要在onStop()方法中使用以下代码行:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference didGameEndRef = rootRef
    .child("PVP")
    .child("active")
    .child(uid)
    .child("didGameEnd");
didGameEndRef.setValue(true);

要不断检查此值是否已更改,您应该将侦听器添加到相同的引用上,如下所示:

didGameEndRef.addValueEventListener(/* ... */);

onDataChange()方法内部,使用以下代码行获取值:

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

推荐阅读