Android:等待 firebase valueEventListener

2024-05-13

我正在尝试使用信号量来等待我的 firebase valueEventListener。我有一个用户信息活动,其中包含用户必须填写的 6 个不同字段。当用户保存他/她的信息时,我想进行“全有或全无”类型的检查。某些用户信息不能重复...例如用户名、电子邮件和电话号码。我正在使用 firebase,目前的总体思路是以下格式:

void saveUserInfo(){
    if(field1 exist in database){
        return;
    }
    .
    .
    .
    if(field6 exist in database){
        return;
    }

    savefield1();
    .
    .
    .
    savefield6();
}

我遇到的问题是检查数据库中是否已存在该值的方法。这是我当前的方法:

   public boolean alreadyInUse(String key, String value) throws InterruptedException {

    final StringBuilder done = new StringBuilder("");
    final Semaphore semaphore = new Semaphore(0);

    mDatabase.child(key).child(value).addListenerForSingleValueEvent(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String result = dataSnapshot.getValue(String.class);
            if(result == null){
                Log.d("WorkoutLog", "result: null");
                done.append("false");
                semaphore.release();
                return;
            }
            else if(result.equals(uID)){
                Log.d("WorkoutLog", "result: " + result.toString());
                done.append("false");
                semaphore.release();
                return;
            }
            else{
                Log.d("WorkoutLog", "result: " + result.toString());
                done.append("true");
                semaphore.release();
                return;
            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


    semaphore.acquire();
    if(done.equals("true")){
        return  true;
    }
    else if(done.equals("false")){
        return false;
    }
    else{
        Log.d("WorkoutLog", "Shouldn't be here");
        return true;
    }

}

现在信号量没有释放...想知道是否有人可以帮助我。如果没有信号量,return 语句将在 firebase 查询完成之前触发......


如前所述,您可以使用Firebase 任务 API https://developers.google.com/android/reference/com/google/android/gms/tasks/package-summary提出于2016 年谷歌 I/O 大会 https://www.youtube.com/watch?v=AJqakuas_6g.

Task<?>[] tasks = new Task[] {
    saveUserName(username),
    saveFriends(friends),
    saveOtherStuff(stuff)
};

Tasks.whenAll(tasks)
    .continueWithTask(new RollbackIfFailure())
    .addOnCompleteListener(this)
    .addOnFailureListener(this);

如果进行修改的每个步骤都可以并行运行,则可以创建一个返回Task https://developers.google.com/android/reference/com/google/android/gms/tasks/Task对于其中每一个如下:

public Task<String> saveUserName(final String username) {
    final TaskCompletionSource<String> tcs = new TaskCompletionSource<>();

    mDatabase.child("users")
        .child(username)
        .addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String username = dataSnapshot.getValue(String.class);
            if (null == username) {
                tcs.setResult(null);
            } else {
                tcs.setException(new IllegalStateException(username));
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            tcs.setException(new IOException(TAG, firebaseError.toException()));
        }
    });

    return tcs.getTask();
}

如果其中任何一个失败,您需要回滚操作。由于这可能受到单个任务的威胁,因此您可以创建一个Continuation https://developers.google.com/android/reference/com/google/android/gms/tasks/Continuation task:

class RollbackIfFailure implements Continuation<Void, Task<Void>> {
    @Override
    public Task<Void> then(@NonNull Task<Void> task) throws Exception {

        final TaskCompletionSource<Void> tcs = new TaskCompletionSource<>();

        if (task.isSuccessful()) {
            tcs.setResult(null);
        } else {
            // Rollback everything
        }

        return tcs.getTask();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:等待 firebase valueEventListener 的相关文章

随机推荐

  • Scrapy 未通过请求回调从项目中的已抓取链接返回附加信息

    基本上 下面的代码会抓取表格的前 5 项 其中一个字段是另一个 href 单击该 href 会提供更多信息 我想收集这些信息并将其添加到原始项目中 所以parse应该将半填充的项目传递给parse next page然后刮掉下一位并返回完成
  • 严重: getRealPathFromConn 错误

    目前我正在调试我们的应用程序中一个看似随机的错误 我将尽力提供尽可能多的细节 基本上一段时间后 我们服务器上某个应用程序的应用程序池就会停止 我必须启动它 或者有时重新启动 Coldfusion 或更糟糕的是机器才能再次运行 服务器日志表明
  • SQLAlchemy+pymysql 错误:sqlalchemy.util.queue.Empty

    尝试使用 Eclispse 在 Ubuntu 上运行 Python 2 SQLAlchemy 0 8 和 MySQL5 2 但我不断收到以下错误 我使用 pymysql 实际上是 pymysql3 引擎 模块监视器 from sqlalch
  • 由于 Crittercism 的 .sh 文件而无法上传应用程序

    我们自过去 2 年以来一直在使用 Crittercism SDK 并且能够成功上传应用程序 自过去 2 天以来 由于 dsym upload sh 文件 我们无法使用 Crittercism 上传应用程序 任何人都遇到同样的问题 Critt
  • 检查ArrayCollection是否为空

    我有一个实体订单 其中包含数组集合中的供应商 在我的控制器中 我想检查这个数组集合是否为空 suppliers order gt getSuppliers 我试过 if suppliers if empty suppliers 有任何想法吗
  • 如何在google colab中降级到tensorflow-gpu版本1.12

    我正在运行一个仅与旧版本的tensorflow GPU兼容的GAN 因此我需要将google colab中的tensorflow gpu从1 15降级到1 12 我尝试使用本中建议的以下命令thread https stackoverflo
  • 自定义 UITableViewCellEditControl

    有没有一种简单的方法来定制UITableViewCellEditControl 更具体地说 我想更改图像的加号和减号 到目前为止我发现了什么 http voidrant tumblr com post 27760918492 customi
  • CSS3输入元素的圆角,没有js/图像

    谁可以为输入元素制作圆角 我需要一种不使用 javascript 和图像的方法 Added
  • 为什么抽屉布局中的视图强制缩放以填充屏幕

    这是我的测试代码
  • 片段开始时显示用于编辑文本的键盘

    当我的片段开始时 我希望我的编辑文本成为焦点 让用户开始输入内容 我可以使用 requestFocus 将其聚焦 但无法显示键盘 我已经尝试过这两种方法 edit EditText view findViewById R id search
  • 根据客户端发送 HTML 或 JSON 响应

    我有一个带有 Eloquent 实体及其各自的 Laravel 应用程序RESTful 资源控制器 http laravel com docs 5 0 controllers restful resource controllers 如下所
  • 如何使用自动布局在自定义 UITableViewCell 内动态设置 UITextView 高度

    I have UITableView every tableViewCell is custom Inside my customTableViewCell is a UITextView TextViews frame is pin or
  • 角度引导手风琴数据绑定问题

    我有 2 个相同型号的下拉菜单 一个位于手风琴内部 另一个位于外部 外部下拉菜单在 2 路数据绑定方面工作良好 但手风琴内部的下拉菜单似乎只有 1 路绑定 换句话说 在 UI 中选择并不会设置模型值 我找到了一个建议here https s
  • 如何将多个文件上传到Firebase?

    有没有办法将多个文件上传到 Firebase 存储 它可以在一次尝试内上传单个文件 如下所示 fileButton addEventListener change function e Get file var file e target
  • 分层对象和 AutoFixture

    我已经实现了一个用于存储标签的类 标签集合必须是分层的 所以我的类是 public class Tag public int Id get set public int Description get set public Tag Pare
  • 使用 PRAW 帮助获取 Reddit 帖子链接到的 URL

    我正在尝试使用 Praw 获取 Reddit 提交标题中链接的帖子 例如提交 http www reddit com r AdviceAnimals comments 1adu71 apparently people still need
  • 分发 IronPython 应用程序

    我正在考虑使用 IronPython 开发一个小型应用程序 但是我想将我的应用程序分发给非技术人员 因此理想情况下 我希望能够为他们提供我的应用程序的标准快捷方式以及安装 IronPython 所需的说明第一的 如果可能的话 我什至希望我的
  • 如何从 MacOS X Dock 启动脚本?

    我知道我可以将应用程序固定到扩展坞并从那里启动它们 但是 有没有办法将不是 MacOS 意义上的 应用程序 的程序 例如 bash 脚本 固定到扩展坞上 您可以将任何文件拖到 Dock 的右侧栏 垃圾箱和文件夹所在的位置 然后单击它来执行它
  • 使用 POJO 仅更新 JOOQ 记录中已更改的字段

    我想使用 POJO 作为源来更新 JOOQ 记录中已更改的字段 Record from Object http www jooq org javadoc 3 8 x org jooq Record html from java lang O
  • Android:等待 firebase valueEventListener

    我正在尝试使用信号量来等待我的 firebase valueEventListener 我有一个用户信息活动 其中包含用户必须填写的 6 个不同字段 当用户保存他 她的信息时 我想进行 全有或全无 类型的检查 某些用户信息不能重复 例如用户