作为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()是否昂贵并导致问题?
提前致谢。
答案 0 :(得分:1)
This answer雄辩地回答了你的第二个问题。 所有Firebase操作都发生在主线程之外,因此,Firebase不太可能导致跳过帧。
既然你提到了Glide,我想补充说Glide动作也是在不同的线程上执行的。
话虽如此,以下行为是计算上昂贵的行为: -
我认为您应该重新考虑如何实施上述内容。例如,您可以考虑通过减少视图层次结构的深度来简化RecyclerView中每个条目的布局。
另外,为什么不使用 notifyItemInserted(position)而不是notifyDataSetChanged()?
答案 1 :(得分:0)
所以这是我具体问题的答案,并不意味着这是正确的方法......恰好满足了我对现状的需求......因此我选择了...
在尝试了很多事情之后,我结束了这可能是从一开始就是我的错。
似乎跳过的框架是因为我在RecyclerViewList上放了“沉重”的工作负载,因为我试图在列表仍然填充时快速滚动,而不是因为应用程序试图处理数据或“复杂”的计算。
我用两种方式“解决”了这个问题: 1)我实现了一个加载ProgressBar,因此用户在填充时无法与列表进行交互。
2)我还启用了离线数据。虽然这并没有“解决”这个问题,但它有助于减少问题发生的可能性。 (无论如何我还需要离线数据)
换句话说,我认为主要技巧是添加ProgressBar并阻止用户与UI进行交互。
如果我稍后会有更多详情,我可能会更新答案。