2016-10-26 80 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

不客氣 –

相關問題