2017-04-02 69 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); 
       } 

      } 
    }); 
}