请看编辑,即使你不知道firebase这可能是一个正常的java问题 请注意,这适用于firebase API的Java服务器版本。我有一个实现ValueEventListener的类,可以看作如下:
public abstract class BalanceResultListener implements ValueEventListener {
private final SteamUser user;
public BalanceResultListener(SteamUser user) {
this.user = user;
}
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(getClass(),"BalanceResultListener for "+user.getUid()+" got data!");
onBalanceChange(user, (int) dataSnapshot.child("keys").getValue());
}
public abstract void onBalanceChange(SteamUser user, int balance);
}
然后扩展如下:
private class BalanceCheckListener extends BalanceResultListener {
// Snip, not relevant
BalanceCheckListener(SteamUser user, int betAmount) {
super(user);
Log.d(getClass(),"BalanceCheckListener for "+user.getUid()+" created!");
// Snip, not relevant
}
@Override
public void onBalanceChange(SteamUser user, int balance) {
Log.d(getClass(),user.getUid()+" has a balance of "+balance);
// Snip, not relevant
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(getClass(),user.getUid()+"'s bet failed due to a db error (1)");
// Snip, not relevant
}
}
最后,这个监听器被添加如下:
<DatabaseReference>.addListenerForSingleValueEvent(new BalanceCheckListener(user, betAmount));
现在,正在调用BalanceCheckListener构造函数中的调试消息,所以我知道它已经到了那一点;然而,程序等待大约3秒然后终止,好像监听器运行并返回。没有调用onDataChange和onCancelled的调试消息(我已经通过使用普通的System.outs仔细检查它不是Log)没有使用BalanceCheckListener(或者只是ValueEventListener)的onDataChange或onCancelled方法被叫。如果数据库没有遇到错误或给我结果,可能会导致返回什么?
修改 我在监听器添加调用后添加了10秒的睡眠,现在最终onCancel正在运行。我不确定为什么要输出错误需要进行此睡眠(可能在输出错误之前控制台流正在关闭?)
编辑编辑:使所有内容在10秒睡眠后正常工作然后将其删除后,即使没有错误也会发生相同的返回。可能是垃圾收集器正在擦除类,因为它没有引用它? (虽然应该有,因为它需要有一个引用来调用它...)