我知道这可能是一个常见问题,但我现在真的陷入困境。
我从两个多个位置接收数据,在收到两个数据后,我需要继续执行,然后将数据返回到调用方法。
我知道这个帖子: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
这有点棘手。但是,我现在真的被它困住了。任何帮助都感激不尽。谢谢。
答案 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
}