我正在使用此方法在Android上检索数据,并且它始终返回null。在ondatachange
内listFinalBus
不为空,但是当返回时,我得到一个空值。
这是我的代码:
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;
}
答案 0 :(得分:2)
您的.addValueEventListener(侦听器)工作异步。所以你将返回你的字段fisrt,它是null,在调用完成后,你的监听器被调用。但你的领域已经退回。 所以要解决这个问题,你是否要编写自己的监听器:
interface MyCallback{
void onSuccess(List<Bus> bus)
}
你的代码可能就像:
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) {
}
});
}
因此,无论您喜欢什么,都可以获取List。只需实现Callback并将其传递给您的存储库。
或者如果您熟悉RxJava。你可以传递一个喜欢
的Observablepublic 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);
}
}
});
}