Firebase:如何从其他节点获取数据?这会导致Skipped帧问题吗?

时间:2017-05-14 09:22:41

标签: android firebase firebase-realtime-database

作为Android和Firebase的初学者,我主要需要一个意见而不是代码。让我描述一下情况然后我有两个问题。

我正在创建一个应用程序来存储有关“绘画”的信息,我希望用户能够根据他们选择的颜色搜索绘画。

我的数据库有几个节点,有问题的是:

颜色:存储所有颜色的地方。每个条目都采用UID->“名称”:“蓝色”

的形式

ColoursToPaintings:每个颜色UID下面都有一个绘画对象。

绘画:存放所有绘画的地方。每幅画都有一个名字,photourl(导致firebase存储),包含所有颜色和其他信息的数组。

我这样做的方式是(流程):

应用程序启动,用户可以从Firebase颜色节点(约1000种颜色)中选择应用程序中加载的颜色。他们搜索例如。 5种颜色。

我执行for循环来动态创建对ColoursToPaintings的引用,这样我就可以获取这些节点(2000)绘画下的所有绘画UID。

然后我在这些2000绘画UID中执行另一个循环来创建对绘画节点的引用,这样我就可以获取包含所有信息的实际绘画。

所有这些画作都显示在recyclerView列表和照片中(照片加载了Glide以实现延迟加载)。

问题1: 上述方法是正确的吗?我还有另一种设计数据库/应用程序的方法吗?

到目前为止,虽然上述方法似乎按预期工作,但如果我选择了许多产生许多结果的颜色,我会遇到“跳过40帧可能在主线程上有太多工作”的问题。这在问题2中引出。

问题2: 假设使用Firebase完成的所有操作都是在一个单独的线程中完成的(是真的吗?)。难道我不应该把所有工作都视为“背景”任务吗?我甚至尝试创建单独的AsyncTasks但仍然跳过帧。

关于问题2.是否可能导致跳过的帧,因为每次从数据库中提取一个绘画时,我将它添加到ArrayList,然后在适配器上添加一个notifyDataSetChanged()。 notifyDataSetChanged()是否昂贵并导致问题?

提前致谢。

2 个答案:

答案 0 :(得分:1)

Frank van Puffelen的

This answer雄辩地回答了你的第二个问题。 所有Firebase操作都发生在主线程之外,因此,Firebase不太可能导致跳过帧。

既然你提到了Glide,我想补充说Glide动作也是在不同的线程上执行的。

话虽如此,以下行为是计算上昂贵的行为: -

  • 循环
  • 布局图(特别适用于RecyclerView的多个布局)
  • 更改Recyclerview的数据集
  • 显示图片

我认为您应该重新考虑如何实施上述内容。例如,您可以考虑通过减少视图层次结构的深度来简化RecyclerView中每个条目的布局。

另外,为什么不使用 notifyItemInserted(position)而不是notifyDataSetChanged()?

答案 1 :(得分:0)

所以这是我具体问题的答案,并不意味着这是正确的方法......恰好满足了我对现状的需求......因此我选择了...

在尝试了很多事情之后,我结束了这可能是从一开始就是我的错。

似乎跳过的框架是因为我在RecyclerViewList上放了“沉重”的工作负载,因为我试图在列表仍然填充时快速滚动,而不是因为应用程序试图处理数据或“复杂”的计算。

我用两种方式“解决”了这个问题: 1)我实现了一个加载ProgressBar,因此用户在填充时无法与列表进行交互。

2)我还启用了离线数据。虽然这并没有“解决”这个问题,但它有助于减少问题发生的可能性。 (无论如何我还需要离线数据)

换句话说,我认为主要技巧是添加ProgressBar并阻止用户与UI进行交互。

如果我稍后会有更多详情,我可能会更新答案。