今天,我用大数据(实际上不是很大,总共有2000条记录)测试我的应用程序,并注意到toObject()
方法执行得很慢。
基本上,我从firestore获得一个记录列表,处理它以在UI中显示,并将其传递给recyclerView
。 为了验证,我删除了所有的处理逻辑,只保留toobject()
。 这是一个瓶颈,总共需要大约9秒。
下面是我的代码:
public ArrayList<MyModel> doProcessing(Context context, QuerySnapshot snapshots) {
ArrayList<MyModel> listToReturn = new ArrayList<>();
for (DocumentSnapshot snap : snapshots.getDocuments()) {
MyModel myModel = snap.toObject(MyModel.class);
...
... // my processing logic
... // check the data and set other fields of myModel based on it
...
listToReturn.add(myModel);
}
return listToReturn;
}
下面是MyModel模式(?!)的屏幕截图。 没那么重。
如何解决这个问题? 有人遇到同样的问题吗?
对给定类的toObject()
的第一次调用总是很慢,而且它永远不会与自定义编写的代码匹配。 这是因为它使用Java反射来发现类对象上的方法和属性的名称,以便它可以将文档字段映射到它们中。 众所周知,反射是非常缓慢的。 如果您不希望速度太慢,则应该在快照上使用getData()来获取字段值的映射
,并手动将这些值映射到数据对象中。
基本上,你必须决定你是想要方便还是想要性能。