【问题标题】:Firebase: How to approach fetching data from other nodes? Can this cause Skipped frames issue tooFirebase:如何从其他节点获取数据?这也会导致跳帧问题吗
【发布时间】:2017-05-19 17:07:22
【问题描述】:

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

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

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

颜色:存储所有颜色的位置。每个条目的形式为 UID->"Name":"Blue"

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

绘画:存储所有绘画的地方。每幅画都有一个名称、photourl(通向 firebase 存储)、包含所有颜色和其他信息的数组。

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

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

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

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

所有这些画都显示在一个recyclerView列表和照片中(照片是用Glide加载实现延迟加载的)。

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

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

问题 2: 假设使用 Firebase 完成的所有事情都在一个单独的线程中完成(是真的吗?)。我所做的所有工作不应该被视为“背景”任务吗?我什至尝试创建单独的 AsyncTask,但仍然出现跳帧。

关于问题2。是否会导致跳帧,因为每次从数据库中获取绘画时,我将其添加到ArrayList,然后我在适配器上περφορμ notifyDataSetChanged()。 notifyDataSetChanged() 会很昂贵并导致问题吗?

提前致谢。

【问题讨论】:

  • 你找到解决这个问题的方法了吗??我的应用也跳过了帧

标签: android firebase firebase-realtime-database


【解决方案1】:

This answer by Frank van Puffelen 雄辩地回答了您的第二个问题。 所有 Firebase 操作都发生在主线程之外,因此 Firebase 导致跳帧的可能性较小。

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

话虽如此,以下操作是计算量大的操作:-

  • 循环
  • 布局绘制(专门针对一个RecyclerView的多个布局)
  • 更改 Recyclerview 的数据集
  • 显示图片

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

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

【讨论】:

  • 感谢 cmets Rohan!
  • 不客气!你成功地解决了问题吗?我可能对您提到的 Firebase 结构进行了一些有用的修改,如果您的问题仍然存在,我可以修改我的答案。
  • 我刚刚发布了一个我接受的“解决方案”。我不是专业的程序员,所以我无法判断什么是最好的,什么不是。我用你提到的“notifyItemInserted(position)”我锄头我做对了!
【解决方案2】:

所以这是我的具体问题的答案,并不意味着这是正确的方法..它恰好适合我当前情况的需要..因此我安顿下来..

在尝试了很多和几件事之后,我最终发现,也许从一开始就是我的错。

似乎跳帧是因为我在 RecyclerViewList 上施加了“繁重”的工作量,因为我试图在列表仍在填充时快速滚动,而不是因为应用程序试图处理数据或“复杂”的计算。

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

2) 我还启用了离线数据。虽然这并不能“解决”问题,但它有助于减少问题发生的机会。 (反正我需要离线数据)

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

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

【讨论】:

    猜你喜欢
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多