2016-10-26 25 views
1

我正在使用以下代码从Firebase数据库中获取数据,但因为它在后台线程中发出网络请求,所以我想等到它完成请求并获取值。例如,所以我想等到变量isAvailable从数据库中获得的值,那么进一步的执行将发生如何检测ValueEventListener是否已在Firebase中获取数据

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 
} 

这段代码总是执行else部分。

+0

为此使用接口。 –

+0

你能举个例子吗? –

回答

2

首先创建一个接口是这样的:

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

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

调用此方法,如:

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

谢谢你......清楚地解释......! –

+0

不客气 –

相关问题