从服务器获取JSON列表后如何正确更新数据集?

时间:2019-01-11 22:03:57

标签: android firebase firebase-realtime-database

我正在从服务器(不是Firebase服务器)获取用户ID的JSON数组。 我还将每个用户的图像存储在Firebase存储中。我有一个用户数据集,其中包含用户ID和用户图像URL。 JSON响应不断更新,因此每次调用我都会收到来自服务器的新响应以及新的用户ID列表。我想出的唯一解决方案是:

清除数据集>遍历JSON数组以将所有用户添加到空数据集>通知数据集已更改。

这样做的问题是效率不高:我会通知每次迭代更改的数据集,并且由于我会(从远程服务器)清除每个新响应的数据集,因此列表会刷新,而不是简单地添加/删除必要的用户。

这是代码的外观:

@Override
public void onResponse(JSONArray response) { // the JSON ARRAY response of user ids ["uid1", "uid334", "uid1123"]
    myDataset.clear(); // clear dataset to prevent duplicates
    for (int i = 0; i < response.length(); i++) {
        try {
            String userKey = response.get(i).toString(); // the currently iterated user id
            final DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
            DatabaseReference userKeyRef = rootRef.child("users").child(userKey); // reference to currently iterated user
            ValueEventListener listener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                myDataset.add(new User(dataSnapshot.getKey(), dataSnapshot.child("imageUrl").getValue().toString())); //add new user: id and image url
                mAdapter.notifyDataSetChanged(); // notify data set changed after adding each user (Not very efficient, huh?)
           }
           @Override
           public void onCancelled(@NonNull DatabaseError databaseError) {
           Log.d(TAG, databaseError.getMessage());
           }
          };
          userKeyRef.addListenerForSingleValueEvent(listener);
      }
      catch (JSONException e) { Log.d(TAG, "message " + e); }
   }

2 个答案:

答案 0 :(得分:1)

您可能对DiffUtil感兴趣。

它使用高效的算法来计算列表之间的差异。而且最重要的是,它可以在后台线程上运行。

它是ALTER TABLE `mytable` ADD `rowId` INT(8) UNIQUE NOT NULL AUTO_INCREMENT FIRST; 的替代方法,是一种用于更新notifyDataSetChanged()的行业标准方法

答案 1 :(得分:0)

您可以使用Firebase Cloud函数。将JSON数组传递给cloud函数,并一次性检索更新的数据集,并通知回收视图这是link