我正在尝试使用通过Firebase连接的对等方获取的数据来更新我的Android应用中的WebView部分.为此,执行将返回所需数据的阻塞操作可能会有所帮助.例如,Chat示例的实现将等待另一个聊天参与者在push.setValue()返回之前写入某些内容.
Firebase可以实现这样的行为吗?
解决方法:
在常规JVM上,您可以使用常规Java同步原语执行此操作.
例如:
// create a java.util.concurrent.Semaphore with 0 initial permits
final Semaphore semaphore = new Semaphore(0);
// attach a value listener to a Firebase reference
ref.addValueEventListener(new ValueEventListener() {
// onDataChange will execute when the current value loaded and whenever it changes
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Todo: do whatever you need to do with the dataSnapshot
// tell the caller that we're done
semaphore.release();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
// wait until the onDataChange callback has released the semaphore
semaphore.acquire();
// send our response message
ref.push().setValue("Oh really? Here is what I think of that");
但这不适用于Android.这是一件好事,因为在影响用户界面的任何事物中使用这种类型的阻塞方法是个坏主意.我有这个代码的唯一原因是因为我需要进行单元测试.
在真实的面向用户的代码中,您应该采用事件驱动的方法.因此,不是“等待数据来然后发送我的消息”,而是“当数据进入时,发送我的消息”:
// attach a value listener to a Firebase reference
ref.addValueEventListener(new ValueEventListener() {
// onDataChange will execute when the current value loaded and whenever it changes
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Todo: do whatever you need to do with the dataSnapshot
// send our response message
ref.push().setValue("Oh really? Here is what I think of that!");
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
最终结果完全相同,但此代码不需要同步,也不会在Android上阻止.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。