Android 如何检测Firebase侦听器是否完成了数据提取?

Android 如何检测Firebase侦听器是否完成了数据提取?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我在Android应用程序中使用Firebase ValueEventlistener从数据库中检索一些数据以初始化UI,但我的问题是,我永远不知道何时完成数据提取,这取决于用户的互联网连接速度,我将延迟5秒,让侦听器完成数据获取,但有时这还不够,数据仍然为null,并给出null指针异常。我想知道Firebase侦听器何时完成获取数据以更新我的UI 这是一种方法,我可以从中获取数据: public void GetRequests(){ Retrieve.add

我在Android应用程序中使用Firebase ValueEventlistener从数据库中检索一些数据以初始化UI,但我的问题是,我永远不知道何时完成数据提取,这取决于用户的互联网连接速度,我将延迟5秒,让侦听器完成数据获取,但有时这还不够,数据仍然为null,并给出null指针异常。我想知道Firebase侦听器何时完成获取数据以更新我的UI

这是一种方法,我可以从中获取数据:

      public void GetRequests(){

         Retrieve.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
     Iterable<DataSnapshot> Games = dataSnapshot.getChildren();


            for(com.google.firebase.database.DataSnapshot game : Games ){

                String Game_Key = game.child("GameKey").getValue(String.class);
                String Game_Location = game.child("Location").getValue(String.class);
                String UserID_Sender = game.child("UserID").getValue(String.class);
                Adapter_Game_Key.add(Game_Key);
                Adapter_UserID_Sender.add(UserID_Sender);
           }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}
public void GetRequests(){
Retrieve.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
Iterable Games=dataSnapshot.getChildren();
用于(com.google.firebase.database.DataSnapshot游戏:游戏){
String Game_Key=Game.child(“GameKey”).getValue(String.class);
String Game_Location=Game.child(“Location”).getValue(String.class);
String UserID\u Sender=game.child(“UserID”).getValue(String.class);
适配器\游戏\键。添加(游戏\键);
Adapter\u UserID\u Sender.add(UserID\u Sender);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
在这里,我尝试从ArrayList中的Firebase侦听器获取数据,以便能够通过将ArrayList传递给ListView的适配器来初始化UI


有人对此有解决方案吗?

请按如下方式在
onDataChanged()
方法中执行所有UI更新:

    ArrayList<Ad> adArrayList_1 = new ArrayList<>();
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("ads");

    ListView listView_1 = (ListView) findViewById(R.id.market_list_view_1);

    MarketArrayAdapter marketArrayAdapter = new MarketArrayAdapter(
            this,
            adArrayList_1
    );

    listView_1.setAdapter(marketArrayAdapter);

            ref.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    adArrayList_1.clear();
                    for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                        Ad ad = snapshot.getValue(Ad.class);
                        adArrayList_1.add(ad);

                    }
                    marketArrayAdapter.notifyDataSetChanged();
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
ArrayList adArrayList_1=new ArrayList();
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child(“ads”);
ListView ListView\u 1=(ListView)findViewById(R.id.market\u list\u view\u 1);
MarketArrayAdapter MarketArrayAdapter=新市场ArrayAdapter(
这
adArrayList_1
);
listView_1.setAdapter(marketArrayAdapter);
ref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
adArrayList_1.clear();
对于(DataSnapshot快照:DataSnapshot.getChildren()){
Ad=snapshot.getValue(Ad.class);
adArrayList_1.添加(ad);
}
marketArrayAdapter.notifyDataSetChanged();
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
下面是我的适配器类

public MarketArrayAdapter(Context context, ArrayList<Ad> list) {
    super(context, 0, list);
}

@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    final Ad ad = getItem(position);
    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.ad_item, parent, false);
    }
    ImageView imageView = (ImageView) convertView.findViewById(R.id.ads_profile_pic);
    TextView title = (TextView) convertView.findViewById(R.id.ads_title);
    TextView price = (TextView) convertView.findViewById(R.id.ads_price);
    TextView description = (TextView) convertView.findViewById(R.id.ads_short_description);

    byte[] imageAsBytes = Base64.decode(ad.getaPictureUri().getBytes(), Base64.DEFAULT);
    imageView.setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length));
    title.setText(ad.getaTitle());
    price.setText(String.valueOf(ad.getaPrice()));
    description.setText(ad.getaDescription());

    parent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent in = new Intent(MarketActivity.this, ViewAdActivity.class);
            in.putExtra("key", ad.getaId());
            startActivity(in);
        }
    });
    return convertView;
}
公共市场ArrayAdapter(上下文,ArrayList列表){ 超级(上下文,0,列表); } @非空 @凌驾 公共视图getView(int位置、视图转换视图、视图组父视图){ 最终Ad=获取项目(位置); if(convertView==null){ convertView=LayoutInflater.from(getContext()).flate(R.layout.ad_项,父项,false); } ImageView ImageView=(ImageView)convertView.findViewById(R.id.ads\u profile\u pic); TextView title=(TextView)convertView.findViewById(R.id.ads_title); TextView价格=(TextView)convertView.findViewById(R.id.ads_价格); TextView description=(TextView)convertView.findViewById(R.id.ads\u short\u description); byte[]imageAsBytes=Base64.decode(ad.getaPictureUri().getBytes(),Base64.DEFAULT); setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes,0,imageAsBytes.length)); title.setText(ad.getaTitle()); price.setText(String.valueOf(ad.getaPrice()); description.setText(ad.getaDescription()); parent.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ Intent in=新的Intent(MarketActivity.this、ViewAdActivity.class); in.putExtra(“key”,ad.getaId()); 星触觉(in); } }); 返回视图; } }


请不要忘记将这一行
marketArrayAdapter.notifyDataSetChanged()

按照如下方法执行
onDataChanged()
方法中的所有UI更新:

    ArrayList<Ad> adArrayList_1 = new ArrayList<>();
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("ads");

    ListView listView_1 = (ListView) findViewById(R.id.market_list_view_1);

    MarketArrayAdapter marketArrayAdapter = new MarketArrayAdapter(
            this,
            adArrayList_1
    );

    listView_1.setAdapter(marketArrayAdapter);

            ref.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    adArrayList_1.clear();
                    for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                        Ad ad = snapshot.getValue(Ad.class);
                        adArrayList_1.add(ad);

                    }
                    marketArrayAdapter.notifyDataSetChanged();
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
ArrayList adArrayList_1=new ArrayList();
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child(“ads”);
ListView ListView\u 1=(ListView)findViewById(R.id.market\u list\u view\u 1);
MarketArrayAdapter MarketArrayAdapter=新市场ArrayAdapter(
这
adArrayList_1
);
listView_1.setAdapter(marketArrayAdapter);
ref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
adArrayList_1.clear();
对于(DataSnapshot快照:DataSnapshot.getChildren()){
Ad=snapshot.getValue(Ad.class);
adArrayList_1.添加(ad);
}
marketArrayAdapter.notifyDataSetChanged();
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
下面是我的适配器类

public MarketArrayAdapter(Context context, ArrayList<Ad> list) {
    super(context, 0, list);
}

@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    final Ad ad = getItem(position);
    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.ad_item, parent, false);
    }
    ImageView imageView = (ImageView) convertView.findViewById(R.id.ads_profile_pic);
    TextView title = (TextView) convertView.findViewById(R.id.ads_title);
    TextView price = (TextView) convertView.findViewById(R.id.ads_price);
    TextView description = (TextView) convertView.findViewById(R.id.ads_short_description);

    byte[] imageAsBytes = Base64.decode(ad.getaPictureUri().getBytes(), Base64.DEFAULT);
    imageView.setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length));
    title.setText(ad.getaTitle());
    price.setText(String.valueOf(ad.getaPrice()));
    description.setText(ad.getaDescription());

    parent.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent in = new Intent(MarketActivity.this, ViewAdActivity.class);
            in.putExtra("key", ad.getaId());
            startActivity(in);
        }
    });
    return convertView;
}
公共市场ArrayAdapter(上下文,ArrayList列表){ 超级(上下文,0,列表); } @非空 @凌驾 公共视图getView(int位置、视图转换视图、视图组父视图){ 最终Ad=获取项目(位置); if(convertView==null){ convertView=LayoutInflater.from(getContext()).flate(R.layout.ad_项,父项,false); } ImageView ImageView=(ImageView)convertView.findViewById(R.id.ads\u profile\u pic); TextView title=(TextView)convertView.findViewById(R.id.ads_title); TextView价格=(TextView)convertView.findViewById(R.id.ads_价格); TextView description=(TextView)convertView.findViewById(R.id.ads\u short\u d