今天,我用大数据(其实不算大,总共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()方法时,我发现 toObject()
对于一个给定的类来说,它的速度总是很慢,而且它永远不会与自定义编写的代码相匹配。 这是因为它使用Java反射来发现类对象上的方法和属性的名称,从而可以将文档字段映射到它们中。 众所周知,反射是非常慢的. 如果你不想让速度变慢,你应该使用 getData() 的快照上获得一个 Map<String, Object>
的字段值,并手动将这些值映射到你的数据对象中。
基本上,你必须决定你想要的是方便还是性能。