【问题标题】:The executing sequence in the code with android studio developmentandroid studio开发代码中的执行顺序
【发布时间】:2019-04-08 16:08:20
【问题描述】:

我试图在我的代码中实现执行顺序。 这是我的应用程序中的用户注册功能,当我调用该功能时, 输出如下(假设 Account 存在): 测试1 帐户存在 但我的预期输出是: 账户存在 测试1 我不知道问题出在哪里,谁能帮我解决这个问题? 提前致谢。

private boolean checkAccountExist(final String userID){
FirebaseDatabase.getInstance().getReference("userAccount").child(userID);
    cDB = FirebaseDatabase.getInstance().getReference("userAccount");
    cDB.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if(dataSnapshot.child(userID).exists()){
                System.out.println("Account Exist");
            }
            else{
                System.out.println("Account isn't exist");
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {}
    });
    System.out.println("test1");
    return true;
}

我的预期输出是: 帐户存在 测试1 但实际上输出是: 测试1 帐户存在

【问题讨论】:

  • 这是一个回调。当它被称为完全不同时,但它不是阻塞的,并且不需要在 test 打印之前(或之后)执行
  • 有什么办法可以让它依次运行?我仍然对它的回调有点困惑,我认为它应该首先运行 onDataChange() 函数
  • 将第二次打印添加到回调方法中。除此之外,没有。
  • @Zoe 谢谢你,我知道问题出在哪里
  • 它似乎总是先运行“返回”动作,然后运行回调方法,真的吗?

标签: java android firebase


【解决方案1】:

All Firebase APIs are asynchronous 有一个很好的理由。您需要学习如何进行异步编程才能使用它。确实没有简单的方法。

您不应尝试将异步 API 转换为同步的阻塞 API,因为如果该对话框在主线程上运行并且数据库花费的时间超过几秒钟,则存在应用程序无响应对话框崩溃的风险响应(因为连接很慢,或者有很多数据)。 API 是异步的这一事实可以保护您免受这场灾难。

【讨论】:

    猜你喜欢
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多