2017-04-02 19 views
0

私はこのメソッドを使用してAndroidでデータを取得していますが、常にnullを返します。 ondatachangeの中でlistFinalBusはnullではありませんが、戻り値が来るとnull値が返されます。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にリスナーを追加する - >あなたがnull値を返す - >あなたのリスナーが呼び出される。 –

+0

次に私は何をすべきですか? –

+0

@PhoenixWang plzどうすればいいですか? –

答えて

2

あなた.addValueEventListener(リスナー)は非同期に動作します:

は、ここに私のコードです。だからあなたはnullであるあなたのフィールドfisrtを返し、呼び出しが終わったらリスナーが呼び出されます。しかし、あなたのフィールドはすでに返されています。あなただけの道具をlike.Andどこに関係なく、あなたのリストを取得することはできませんので

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) { 

    } 

}); 

} 

とあなたのコードのようなものでした:あなたがあなた自身のリスナーは以下のように書くかどうか だから、これを修正するにはコールバックをリポジトリに渡します。

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

      } 
    }); 
} 
関連する問題