Java 如何等待从Firebase数据库中提取数据

Java 如何等待从Firebase数据库中提取数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我试图从某个表中获取ReceiveUID,然后从另一个表中获取UID的值。 我认为正在发生的事情是,适配器是在获取receivedNames数组列表之前设置的,因为当我将receivedName数组列表设置为常量时,应用程序运行正常。 请告诉我这里出了什么问题,如果这是正确的方法 这是我的数据库的外观, 表3片段的代码 public class Tab3 extends Fragment { private static RecyclerView.Adapter adapter; priva

我试图从某个表中获取ReceiveUID,然后从另一个表中获取UID的值。 我认为正在发生的事情是,适配器是在获取receivedNames数组列表之前设置的,因为当我将receivedName数组列表设置为常量时,应用程序运行正常。 请告诉我这里出了什么问题,如果这是正确的方法 这是我的数据库的外观,

表3片段的代码

public class Tab3 extends Fragment {

private static RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
private static RecyclerView recyclerView;
private static ArrayList<String> reminderMessages;
protected static ArrayList<String> receiverNames;
String senderUID;
private DatabaseReference mDatabase;
//Overriden method onCreateView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


    //Change R.layout.tab1 in you classes
    View v = inflater.inflate(R.layout.tab3, container, false);
    //get current user
    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    reminderMessages = new ArrayList<>();
    receiverNames = new ArrayList<>();


    senderUID = user.getUid();
    mDatabase = FirebaseDatabase.getInstance().getReference();
    Query query = mDatabase.child("reminders").orderByChild("senderUID").equalTo(senderUID);

    //Setting size of recycler view as constant
    recyclerView = (RecyclerView) v.findViewById(R.id.my_recycler_view);
    recyclerView.setHasFixedSize(true);

    //Setting Linear Layout
    layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());

    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                //Getting message from database
                String message = ds.child("reminderMessage").getValue(String.class);
                //Adding database to ArrayList
                reminderMessages.add(message);
                //Getting ReceiverUID
                String rUID = ds.child("receiverUID").getValue(String.class);
                //Getting corresponding username of the ReceiverUID
                GetName getName = new GetName();
                getName.GetName(rUID);
                reminderMessages.add(message);
               // Log.d("String names", receiverNames.toString());
            }


            adapter = new DataAdapter(reminderMessages,receiverNames);
            recyclerView.setAdapter(adapter);

        }


        @Override
        public void onCancelled(DatabaseError databaseError) {
            //Error in Reaching Database
            Toast.makeText(getContext(), "Something went Wrong!", Toast.LENGTH_SHORT).show();
        }


    });
    //Returning the layout file after inflating
    return v;
}

要解决此问题,请在
onDataChange()
方法中添加您的
receiverNames
ArrayList声明,否则它将为空。这是由于该方法的异步行为造成的。如果您想在该方法之外使用这些值,请参阅我的答案。

谢谢,工作非常完美。
public class GetName {
private FirebaseAuth auth;
ListView listView;
private DatabaseReference mDatabase;
String receiverName;
public void GetName(String UID){
    mDatabase = FirebaseDatabase.getInstance().getReference().child("users");

    Query query = mDatabase.orderByKey().equalTo(UID);
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot2) {

            // dataSnapshot is the "issue" node with all children with id 0
            for (DataSnapshot users : dataSnapshot2.getChildren()) {
                receiverName = users.child("username").getValue(String.class);

                receiverNames.add(receiverName);
                Log.d("name retrieved",receiverNames.toString());

            }


        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });




}