2017-04-02 82 views
0

我正在使用此方法檢索Android上的數據,並且它始終返回null。在ondatachangelistFinalBus不爲空,但當返回時,我得到一個空值。Firebase檢索數據始終爲空

這裏是我的代碼:

public List<Bus> findAllBus() { 
    // Read from the database 
    myRef.child("Bus").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      Log.d(TAG, "onDataChange: " + dataSnapshot.toString()); 
      for (DataSnapshot userDataSnapshot : dataSnapshot.getChildren()) { 

       Bus bus = userDataSnapshot.getValue(Bus.class); 
       Log.d(TAG, "onDataChange: after get value " + bus.getId().toString()+" nom "+bus.getNom().toString()); 

       listFinalBus.add(bus); 
       Log.d(TAG, "onDataChange: list before return not null her" + listFinalBus.size()); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 

    }); 

    Log.d(TAG, "onDataChange: list firas return" + listFinalBus.size()); 
    //return is null 
    return listFinalBus; 
} 
+1

回調不能這樣工作。你的聽衆在你回來之後被調用。像這樣的情景:將監聽器添加到databaseReference - >您返回空值 - >您的監聽器被調用。 –

+0

那我該怎麼辦plz –

+0

@PhoenixWang PLZ我該怎麼辦? –

回答

2

你.addValueEventListener(聽衆)的作品異步。所以你會返回你的字段是空的,在調用完成後,你的監聽器會被調用。但你的領域已經回來了。 因此,要解決這個問題,無論你寫你自己的監聽器,如下:

,你的代碼可能是這樣的:

public void findAllBus(MyCallback callback) { 
// Read from the database 
myRef.child("Bus").addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 

     Log.d(TAG, "onDataChange: " + dataSnapshot.toString()); 
     for (DataSnapshot userDataSnapshot : dataSnapshot.getChildren()) { 

      Bus bus = userDataSnapshot.getValue(Bus.class); 
      Log.d(TAG, "onDataChange: after get value " + bus.getId().toString()+" nom "+bus.getNom().toString()); 

      listFinalBus.add(bus); 
      Log.d(TAG, "onDataChange: list before return not null her" + listFinalBus.size()); 
     } 
     callback.onSuccess(List<Bus> bus); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 

}); 

} 

所以,你可以得到你的名單無論你在哪裏like.And只是工具回調並將其傳遞到您的存儲庫。

或者如果您熟悉RxJava。你可以通過一個Observable,它會喜歡

public Observable<Bus> findAllBus(){ 
     return Observable.create(new ObservableOnSubscribe<Bus>() { 
     @Override 
     public void subscribe(ObservableEmitter<Bus> e) throws Exception { 
      myRef.child("Bus").addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 

        Log.d(TAG, "onDataChange: " + dataSnapshot.toString()); 
        for (DataSnapshot userDataSnapshot : dataSnapshot.getChildren()) { 

         Bus bus = userDataSnapshot.getValue(Bus.class); 
         Log.d(TAG, "onDataChange: after get value " + bus.getId().toString()+" nom "+bus.getNom().toString()); 

         e.onNext(bus);        
         Log.d(TAG, "onDataChange: list before return not null her" + listFinalBus.size()); 
        } 
        e.onComplete(); 

       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        e.onError(error); 
       } 

      } 
    }); 
}