从Firebase

时间:2016-07-31 16:05:17

标签: android firebase firebase-realtime-database

我知道这可能是一个常见问题,但我现在真的陷入困境。

我从两个多个位置接收数据,在收到两个数据后,我需要继续执行,然后将数据返回到调用方法。

我知道这个帖子:https://stackoverflow.com/a/33204705/1820644但它实际上不适合我需要将数据返回给调用方法。

对于阻止UI线程的方法,我可以从AsyncTask调用它,没有问题。但是如何将数据返回到我已成功完成执行的调用方法。

这是我的助手类

// This method should be called in AsyncTask
public boolean doComputation() {
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("activity")
                .child(id);

        ref.child("path1").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
               // Call 1 completed
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        ref.child("path2").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
               // Call 2 completed
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        // Some more to do

        // Need to return true after execution complete
        return true;
}

我无法在onDataChange内部返回true,因为它会计入onDataChange方法而不是doComputation

我可以通过将其移动到另一个方法来执行计算,并且在每次onDataChange回调之后我可以检查变量计数,如果它是 2 ,我可以执行计算。但是在完成之后我需要将它通知给执行完成的调用方法。

Firebase这有点棘手。但是,我现在真的被它困住了。任何帮助都感激不尽。谢谢。

3 个答案:

答案 0 :(得分:1)

我已使用Firebase已使用的<label>First Name:</label><input type="name" class="form-control" id="fname"> <label>Last Name:</label><input type="name" class="form-control" id="lname"> <button class="btn btn-primary" id="add">Add</button> 。很棒。

如@qbix所述,This answer做同样的事情。答案中的例子解释得很好。

您还可以找到此API说明here的视频链接。

我已经尝试并测试过它。解决了我的问题。

答案 1 :(得分:0)

取决于这种情况,我通常做的是在每个监听器完成其工作之后设置一个标志,然后调用方法来检查标志。如果它们都已完成,则进行下一步操作。

例如

private Boolean listener1Completed;
private Boolean listener2Completed;

public void addListeners() {
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("activity")
            .child(id);

    ref.child("path1").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
           listener1Completed = true;
           checkListenerStatus();
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });
    ref.child("path2").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
           listener2Completed = true;
           checkListenerStatus();
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });
}

private void checkListenerStatus() {
    if (listener1Completed && listener2Completed) {
        // do computation
    }
}

答案 2 :(得分:0)

由于firebase在另一个线程中工作,因此无法立即返回所需的结果。您必须创建回调以在收到结果时通知调用者。您可以使用界面read here

来实现此目的

另一种方式。你可以从Asynctask获得结果 Return a value from AsyncTask in Android

或者您可以在参数中传递您的类(不在AsyncTask作业中)

public void doComputation(yourCallerClass cls) {
//firebase result.....void

cls.YourResult(trueOrFalse);
.....
}

在你的调用者类实例中,例如。 yourCallerClass

...
public void YourResult(boolean result){
// do stuff
}