Firebase检索数据始终为null

时间:2017-04-02 20:33:45

标签: android firebase firebase-realtime-database

我正在使用此方法在Android上检索数据,并且它始终返回null。在ondatachangelistFinalBus不为空,但是当返回时,我得到一个空值。

这是我的代码:

   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 个答案:

答案 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。你可以传递一个喜欢

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

            }
    });
}