Java 什么会导致firebase ValueEventListener不调用onDataChange或onCancelled?

Java 什么会导致firebase ValueEventListener不调用onDataChange或onCancelled?,java,firebase,firebase-realtime-database,Java,Firebase,Firebase Realtime Database,请查看编辑,即使您不了解firebase,这可能是一个正常的java问题 请注意,这是针对firebase API的Java服务器版本。我有一个实现ValueEventListener的类,如下所示: public abstract class BalanceResultListener implements ValueEventListener { private final SteamUser user; public BalanceResultListener(Steam

请查看编辑,即使您不了解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);
}
<DatabaseReference>.addListenerForSingleValueEvent(new BalanceCheckListener(user, betAmount));
然后将其扩展如下:

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
    }
}
最后,将添加此侦听器,如下所示:

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);
}
<DatabaseReference>.addListenerForSingleValueEvent(new BalanceCheckListener(user, betAmount));
.addListenerForSingleValueEvent(新的BalanceCheckListener(用户,betAmount));
现在,BalanceCheckListener构造函数中的调试消息正在被调用,所以我知道它已经到了那个地步;但是,程序等待大约3秒钟,然后终止,就像侦听器运行并返回一样。onDataChange和onCancelled的调试消息没有被调用(我已经使用普通System.outs仔细检查了它不是日志)BalanceCheckListener(或者实际上只是ValueEventListener)的onDataChange或onCancelled方法都没有被调用。如果数据库没有遇到错误或没有给出结果,是什么导致了回报

编辑: 在侦听器add调用之后,我添加了10秒的睡眠,现在onCancel终于开始运行了。我不确定为什么要发生这种睡眠才能输出错误(可能是控制台流在错误输出之前关闭了?)


EDIT EDIT:在使用10秒睡眠使所有内容正常工作并将其删除后,即使没有错误,也会出现相同的返回。是否垃圾收集器正在擦除该类,因为没有对它的引用?(虽然应该有,因为需要有一个引用来调用它…)

Firebase数据库SDK在单独的线程上与其服务器交互,以便主程序可以继续解锁。如果主线程退出,Firebase线程将永远无法检索其数据。请参阅Firebase数据库SDK在单独的线程上与其服务器交互,以便主程序可以继续解锁。如果主线程退出,Firebase线程将永远无法检索其数据。看见