Android:等待firebase valueEventListener [英] Android: wait for firebase valueEventListener

查看:56
本文介绍了Android:等待firebase valueEventListener的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用信号量来等待我的Firebase valueEventListener.我有一个用户信息活动,其中包含用户必须填写的6个不同字段.当用户保存他/她的信息时,我要进行全部或全部"检查.某些用户信息不能重复...例如用户名,电子邮件和电话号码.我使用的是Firebase,目前的一般想法是采用以下格式:

I am trying to use Semaphore to wait for my firebase valueEventListener. I have an user info activity with 6 different fields that the user must fill out. When the user saves his/her info, I want to do an "all or nothing" type of check. Certain user info cannot be duplicated...for example user name, email, and phonenumber. I am using firebase and currently the general idea is of the format:

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

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

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

The issue I am having is in the method that checks whether or not the value already exists in the database. Here is my current method:

   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;
    }

}

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

Right now the semaphore is not releasing...Was wondering if anyone can help me out here. Without the semaphore, the return statement will fire before the firebase query can complete...

推荐答案

侦听器回调方法在主线程上运行.如果在主线程上调用alreadyInUse(),它将在semaphore.acquire()处阻塞该线程,从而阻止回调运行并释放信号量.

The listener callback methods run on the main thread. If you call alreadyInUse() on the main thread, it will block the thread at semaphore.acquire(), preventing the callbacks from running and releasing the semaphore.

您可能会找到此答案对相关问题很有帮助.

You might find this answer to a related question helpful.

这篇关于Android:等待firebase valueEventListener的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆