【问题标题】:How to Detect if Firebase Listeners finished fetching Data?如何检测 Firebase 侦听器是否完成获取数据?
【发布时间】:2017-04-06 23:49:20
【问题描述】:

我在 Android 应用程序中使用 Firebase ValueEventlistener 从数据库中检索一些数据来初始化我的 UI,但我的问题是我永远不知道何时完成数据提取,这取决于用户互联网连接的速度,我为侦听器完成获取数据设置了 5 秒的延迟,但有时这还不够,并且数据仍然为空,从而给出空指针异常。我想知道 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) {

        }
    });
}

在这里,我尝试从 ArrayList 中的 Firebase 侦听器获取数据,以便能够通过将 ArrayLists 传递给 ListView 的适配器来初始化 UI。

请问有人有解决办法吗?

【问题讨论】:

  • Firebase 监听器会同步数据,所以严格来说,它们从未完成。另一方面:每次onDataChange 触发时,您都会从数据库中获得一组完整的数据——因此您可以考虑每个“已完成”的数据。如果您分享minimum code that reproduces where you're stuck,可能更容易为您提供帮助。
  • @FrankvanPuffelen 我编辑了代码并添加了代码sn-p,请看一下

标签: android firebase firebase-realtime-database


【解决方案1】:

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

                }
            });

我的适配器类在下面

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

}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2014-04-14
    相关资源
    最近更新 更多