Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase:如何从其他节点获取数据?这是否也会导致跳过帧问题_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android Firebase:如何从其他节点获取数据?这是否也会导致跳过帧问题

Android Firebase:如何从其他节点获取数据?这是否也会导致跳过帧问题,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,作为Android和Firebase的初学者,我主要需要的是意见,而不是代码。让我描述一下情况,然后我有两个问题 我正在创建一个应用程序来存储有关“绘画”的信息,我希望用户能够根据他们选择的一些颜色搜索绘画 我的数据库有几个节点,这些节点是: 颜色:储存所有颜色的地方。每个条目的格式为UID->“名称”:“蓝色” 彩色颜料:每种颜色下都有一个绘画对象 绘画:存放所有绘画的地方。每幅画都有一个名字,photourl(通向firebase存储),包含所有颜色和其他信息的数组 他们的做法是(流动):

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

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

我的数据库有几个节点,这些节点是:

颜色:储存所有颜色的地方。每个条目的格式为UID->“名称”:“蓝色”

彩色颜料:每种颜色下都有一个绘画对象

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

他们的做法是(流动):

应用程序启动,用户可以从Firebase颜色节点选择应用程序中加载的颜色(约1000种颜色)。他们寻找五种颜色

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

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

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

问题1: 上述方法正确吗?是否有其他方法可以设计数据库/应用程序

到目前为止,尽管上面的方法看起来像预期的那样工作,但如果我选择了许多产生许多结果的颜色,我会遇到“跳过40帧可能在主线程上有太多工作”的问题。这引出了问题2

问题2: 人们认为Firebase的所有操作都是在一个单独的线程中完成的(这是真的吗?)。我做的所有工作不都应该被视为“背景”任务吗?我甚至尝试创建单独的异步任务,但仍然得到跳过的帧

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

提前谢谢。

弗兰克·范·帕夫伦雄辩地回答了你的第二个问题。 所有Firebase操作都发生在主线程之外,因此,Firebase导致跳帧的可能性较小

既然您提到了Glide,我想补充一点,Glide操作也在单独的线程上执行

话虽如此,以下操作在计算上是昂贵的:-

  • 循环
  • 布局图(专门用于一个RecyclerView的多个布局)
  • 更改Recyclerview的数据集
  • 展示图片
我认为你应该重新考虑如何实施上述措施。例如,您可以考虑通过减少视图层次结构的深度来简化ReaveReView中的每个条目的布局。p>
另外,为什么不使用notifyItemInserted(position)而不是notifyDataSetChanged()?

这是我具体问题的答案,并不意味着这是正确的方法。。这正好符合我目前的需要。。因此我决定

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

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

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

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

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


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

谢谢Rohan的评论!不客气!你成功地解决了这个问题吗?我可能会对您提到的Firebase结构进行一些有用的修改,如果您的问题仍然存在,我可以对我的答案进行编辑。我刚刚发布了一个解决方案。。我不是专业的程序员,所以我无法分辨什么是最好的,什么不是。我使用了你提到的“notifyItemInserted(position)”我认为我做得对!你找到这个问题的解决办法了吗??。我的应用程序中也跳过了帧