java - 如何连续读取 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
},
我有onDestroy
等onDestroy
方法来改变“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 异常。
解决方案
didGameEnd
要将属性的值设置为false
to 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
}
}
推荐阅读
- html - 使用本地存储在页面刷新时加载增量和减量输入值
- swift - 确保在启动共享表以共享图像之前渲染图像?
- gtk - 为什么在一个 GTK 3 UI 文件中有多个模板定义会引发错误?
- python - 如何使用 python 从 DataCamp 导出数据?
- javascript - 需要将 http 站点加载为 https 的站点的即时帮助:
- c++ - 即使在将大数组移动到堆之后,C++ 未知堆栈溢出
- google-cloud-platform - 使用 Node.js 的 Google Cloud App Engine 任务清除队列
- python - 我将如何使用美丽的汤从这个网站上抓取数据?
- javascript - 如果在菜单外按下该键,如何防止键绑定功能运行?
- python - 从 shopify prodcts api 获取特定字段