如何检测ValueEventListener是否在Firebase中获取数据 [英] How to detect if ValueEventListener has fetched data or not in Firebase

查看:88
本文介绍了如何检测ValueEventListener是否在Firebase中获取数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用以下代码从Firebase DB中获取数据,但由于它在后台线程中发出网络请求,所以我想等到它完成请求并获取值。例如,

  boolean isAvailable = false; 
usernameReference.addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot){
isAvailable = true;
}

@Override
public void onCancelled(DatabaseError databaseError){
progressBar.setVisibility(View.GONE);
}
});
if(isAvailable){
//在这里做某事
}
else {
//在这里做某事
}
$ b $ p
$ b

这段代码总是执行else部分,所以我想等到变量 isAvailable 从数据库中获取值,然后进一步执行。

解决方案

首先创建一个如下的界面: b
$ b

  public interface IsAvailableCallback {
void onAvailableCallback(boolean isAvailable);





$ b

假设你的上面的代码是在这个方法中,接口对象触发回调:

  public void isAvailable(IsAvailableCallback callback){
boolean isAvailable = false;
usernameReference.addListenerForSingleValueEvent(new ValueEventListener(){
@Override $ b $ public void onDataChange(DataSnapshot dataSnapshot){
isAvailable = true;
//这将触发true
callback.onAvailableCallback(isAvailable);
}
$ b $ @Override
public void onCancelled(DatabaseError databaseError){
progressBar.setVisibility(View.GONE);
//这将触发false
callback.onAvailableCallback(isAvailable);
}
});

$ / code>

调用这个方法:
$ b $ (
$ p $ isAvailable(new IsAvailableCallback(){
@Override
public void onAvailableCallback(boolean isAvailable){
//你将在这里得到回调,在这里做你的条件


code $ pre

I'm using following code to fetch the data from Firebase DB but as it makes network request in background thread so I want to wait till it completes the request and get a value. For example,

boolean isAvailable=false;
    usernameReference.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        isAvailable = true;
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        progressBar.setVisibility(View.GONE);
                    }
                });
if(isAvailable){
       //do something here
}
else{
      //do something here 
}

This snippet always execute the else part so I want to wait till the variable isAvailable get the value from database then further Execution will take place.

解决方案

First create an interface like this:

public interface IsAvailableCallback {
    void onAvailableCallback(boolean isAvailable);
}

Suppose your above code is in this method which takes interface object to trigger callback like :

public void isAvailable(IsAvailableCallback callback) {
    boolean isAvailable=false;
    usernameReference.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    isAvailable = true;
                    //this will trigger true
                    callback.onAvailableCallback(isAvailable);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    progressBar.setVisibility(View.GONE);
                    //this will trigger false
                    callback.onAvailableCallback(isAvailable);
                }
            });                
}

Call this method like :

isAvailable(new IsAvailableCallback() {
    @Override
    public void onAvailableCallback(boolean isAvailable) {
        //you will get callback here, Do your if condition here
    }
}

这篇关于如何检测ValueEventListener是否在Firebase中获取数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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