我有一个用户在Firebase中创建游戏室。如果其他用户加入游戏,一切正常。我的问题是“创建者”可能退出应用程序或关闭应用程序,或者当其他用户加入时不在游戏中。所以我想在这种情况下将游戏室从火力中移除。我正在使用以下代码:
public void removeGameFromWaitQueue() {
DatabaseReference data = FirebaseDatabase.getInstance().getReference().child("games").child(mCurrentGameKey);
if (mCurrentGame.getState() == DatabaseModels.Game.State.JOINED.ordinal()){
//do nothing
}
else
data.removeValue();
}
我的问题是,当我在onStop()和onDestroy()中添加代码时,当然会删除游戏,但是即使其他玩家加入游戏并转到游戏活动中,实际上onStop()和onDestroy也是如此。调用,因此游戏再次删除。如果创建者退出活动,是否有其他删除游戏的方法,但是如果应用程序转到下一个活动,则没有其他方法?
编辑
我将代码更改了一点:
public void removeGameFromWaitQueue() {
final DatabaseReference data = FirebaseDatabase.getInstance().getReference().child("games").child(mCurrentGameKey);
data.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
if (mCurrentGame.getState() == DatabaseModels.Game.State.OPEN.ordinal()){
data.removeValue();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
这样,当mCurrentGame状态打开时,我可以删除游戏。现在的问题是,if(snapshot.exists())在游戏开始后无法正常工作,因为我得到了Null Exception。代码有问题吗?意味着快照正在检查mCurrentGame还是我错了?
更新
我设法使代码按我的需要工作:
@Override
protected void onStop() {
super.onStop();
if(mCurrentGame!=null) {
removeGameFromWaitQueue();
}
// un-subscribe the listeners
if (mCreatedGamesListener != null) {
mGamesDatabaseRef.removeEventListener(mCreatedGamesListener);
}
if (mJoinedGamesListener != null) {
mGamesDatabaseRef.removeEventListener(mJoinedGamesListener);
}
}
public void removeGameFromWaitQueue() {
final DatabaseReference data = FirebaseDatabase.getInstance().getReference().child("games").child(mCurrentGameKey);
data.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
mCurrentGame = snapshot.getValue(DatabaseModels.Game.class);
if (mCurrentGame.getState() == DatabaseModels.Game.State.OPEN.ordinal()){
data.removeValue();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
很难预测用户的每个“不正常”行为,所以现在我的问题是,在IF检查所有DatabaseReference数据是否存在的情况下,我需要所有这些。正如onStop()在许多情况下调用的那样,如果我的用户参加了活动但他没有创建游戏,则DatabaseRerence为空。因此,调用数据将引发异常。那么如何检查DatabaseReference是否存在或是否已创建?