首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从RecyclerView onBindViewHolder调用时,调用Firebase DatabaseReferenc方法UpdateChildren()会引发堆栈溢出错误

从RecyclerView的onBindViewHolder方法调用Firebase DatabaseReference的updateChildren()方法会引发堆栈溢出错误的原因是循环调用。当RecyclerView的数据源发生变化时,onBindViewHolder方法会被调用来更新列表项的内容。而在onBindViewHolder方法中调用Firebase DatabaseReference的updateChildren()方法,会导致数据源的更新,从而再次触发RecyclerView的数据变化,进而再次调用onBindViewHolder方法,形成了一个无限循环调用的过程,最终导致堆栈溢出错误。

为了解决这个问题,可以考虑以下几种方法:

  1. 将Firebase DatabaseReference的updateChildren()方法移出onBindViewHolder方法,避免在每次绑定数据时都调用该方法。可以在适当的时机,例如在RecyclerView的数据源发生变化时,调用updateChildren()方法来更新数据库。
  2. 在调用updateChildren()方法之前,先检查数据是否已经发生变化。可以通过比较新旧数据的差异来确定是否需要更新数据库。如果数据没有变化,可以避免调用updateChildren()方法,从而避免循环调用。
  3. 使用合适的数据更新策略。可以考虑使用批量更新的方式,将多个数据更新操作合并为一个操作,减少数据库的访问次数。例如,可以将需要更新的数据先存储在一个Map中,然后在适当的时机一次性调用updateChildren()方法来更新数据库。

总结起来,避免在RecyclerView的onBindViewHolder方法中直接调用Firebase DatabaseReference的updateChildren()方法,以避免循环调用和堆栈溢出错误。合理地选择调用时机和更新策略,可以提高性能并避免出现问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android知识笔记:记录 2 个 “容易误解” 的Android 知识点

RecyclerView卡片中持有的资源,到底该什么时候释放? 之前我们讨论过 View的onAttachedToWindow ,onDetachedFromWindow 调用时机 。...在RecyclerView中,Item的这两个方法分别会在【首次出现】和【完全滑出屏幕】(即在屏幕中完全不可见)时回(在Adapter中也可以重写同名方法,用来监听ViewHolder的出现和消失)。...正常情况下,它们会被扔到mCachedViews里面去(注意mCachedViews中取出来时也是不用重新绑定数据的,即不会经过onBindViewHolder方法)。...Adapter中有个onViewRecycled方法,看名字就知道是当Item被回收后回的。。。...没错了,这个方法时,表示这个Holder已经被扔进mRecyclerPool.mScrap里了,也就是再次取出的时候会经过onBindViewHolder方法重新绑定数据。

93120

再也不用担心面试官问RecycleView了

所以我们假设加载RecyclView开始盘的话(页面假设可以容纳7条数据): 首先,7条数据依次调用onCreateViewHolder和onBindViewHolder。...所以就直接复用了,并调用onBindViewHolder方法绑定数据。...后面依次类推,刚消失的两条数据会被放到mCacheViews中,再出现的时候是不会调用onBindViewHolder方法,而复用的第三条数据是mRecyclerPool中取得,就会调用onBindViewHolder...一共18次调用。 如果一开始滑动的是老数据,那么滑动10-2个,就会走8个bindview方法。然后滑回去,走10-2个bindview方法。一共16次调用。 「但是但是」,实际情况又有点不一样。...比如我调用了notifyItemChanged(14,"changeColor"),那么在onBindViewHolder方法中做下判断即可: @Override public void

1.5K20
  • RecyclerView 必知必会

    根据View的绘制流程,首先调用RecyclerView重写的draw()方法,随后super.draw()即调用View的draw(),该方法会先调用onDraw()(这个方法RecyclerView...detachAndScrapAttachedViews()根据情况,将原来的Item View放入Scrap Heap或Recycle Pool,从而在复用时提升效率。...其中next()调用了getViewForPosition(currentPosition),该方法RecyclerView的回收机制实现类Recycler中获取合适的View,在后文的回收机制中会介绍该方法的具体实现...或mCachedViews中获取的ViewHolder,则不会调用onBindViewHolder(),mAttachedScrap和mCachedViews也就是我们所说的Scrap Heap;而如果...RecyclerView局部刷新的实现原理也是基于RecyclerView的回收机制,即能直接复用的ViewHolder就不调用onBindViewHolder()。

    4.2K90

    RecyclerView 必知必会

    根据View的绘制流程,首先调用RecyclerView重写的draw()方法,随后super.draw()即调用View的draw(),该方法会先调用onDraw()(这个方法RecyclerView...detachAndScrapAttachedViews()根据情况,将原来的Item View放入Scrap Heap或Recycle Pool,从而在复用时提升效率。...其中next()调用了getViewForPosition(currentPosition),该方法RecyclerView的回收机制实现类Recycler中获取合适的View,在后文的回收机制中会介绍该方法的具体实现...此方法中可以做一些状态变化时的处理,比如拖拽的时候修改背景色。 clearView(): 用户交互结束时回。此方法可以做一些状态的清空,比如拖拽结束后还原背景色。...或mCachedViews中获取的ViewHolder,则不会调用onBindViewHolder(),mAttachedScrap和mCachedViews也就是我们所说的Scrap Heap;而如果

    2.6K70

    Recyclerview 刷新「建议收藏」

    方法对全部Item进行刷新,而recyclerview则可以精准刷新。...介绍: (1)notifyItemChanged(position) 只刷新该position的Item,即只是该Item调用onBindViewHolder,因此如果对数据源进行插、移除操作不能改方法只刷新操作的...int toPosition) 移动并进行刷新 注意: 当对数据源进行移除或添加操作时需要立即执行刷新操作,将adapter内部记录的数据源状态和我们传给adapter的数据源进行同步更新,否则可能导致...RecyclerView报如下异常,同时还没有我们应用异常堆栈信息 java.lang.IndexOutOfBoundsException: Inconsistency detected....RuntimeInit.java:547) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824) 这里列举一种导致该异常的例子 错误

    1.1K30

    壹二APP开发实践回顾总结出40条精要

    另外 CardView 阴影效果实现机制不一样,这个导致在5.0前后是有差异性的; 17、 友盟的QQ分享 需要记得替换,不然回异常; 18、RecyclerView 未设置 LayoutManager...31、RecyclerView 的 LayoutParams 会是 MarginLayoutParams,如果重设一个 ViewGroup.LayoutParams将会报错,在 onBindViewHolder...33、关于系统权限弹框,联想手机上面会影响到宿主 Activity 的状态, onSaveInstanceState() 的方法,如果在这之后需要弹出DialogFragment或者 执行FragmentTransaction...解决方法直接调用 commitAllowingStateLoss()。...该方案不会影响 RecyclerView 的缓存策略。即你设了独立 id 的 holder ,如有必要,还是优先被复用。

    88740

    recycleview的优化_recyclerview原理

    需要新插入的viewcacheView/Pool中找,没找到则createViewHolder。而ViewGroup中移除的子view放到Pool缓存池中,如下图中的itemView b。...当调用notifyDataSetChanged()方法时,ViewHolder进入上面的一级缓存mAttachedScrap中,而不是进入缓存池pool中,这样的好处:1)不会存在缓存池pool满的问题...同时onBindViewHolder调用次数多于onCreateViewHolder的次数,如从RecyclerViewPool缓存池中取到的View都需要重新bindView,所以我们可以把监听放到...notifyDataSetChanged触发所有item的detached回再触发onAttached回。...8、RecyclerView中的一些方法 onViewRecycled():当 ViewHolder 已经确认被回收,且要放进 RecyclerViewPool 中前,该方法会被回

    4.1K21

    基于滑动场景解析RecyclerView的回收复用机制原理

    都是复用的,因为没有 create viewHolder 的日志,然后只有后面3个卡位重新绑定数据,调用onBindViewHolder();那么问题来了: Q2: 在这个过程中,为什么当 RecyclerView...再次向上滑动重新显示第一行的5个卡位时,只有后面3个卡位触发了 onBindViewHolder() 方法,重新绑定数据呢?...网上一些分析的文章有说,RecyclerView 在复用时会按顺序去 mChangedScrap, mAttachedScrap 等等缓存里找,没有找到再往下去找,代码上来看是这样没错,但我觉得这样表述有问题...,然后 LayoutManager 接着调用 fill() 方法去处理需要复用和回收的卡位,最终会调用上述 recyclerView() 这个方法开始进行回收工作。...Q2: 在这个过程中,为什么当 RecyclerView 再次向上滑动重新显示第一行的5个卡位时,只有后面3个卡位触发了 onBindViewHolder() 方法,重新绑定数据呢?

    3K60

    Flutter 中的Error的捕获及处理

    默认情况下,会调用 FlutterError.dumpErrorToConsole 方法,正如方法名表示的那样,将错误转储到当前的设备日志中。...当 IDE 运行应用时,检查器重写了该方法错误也被发送到 IDE 的控制台,可以在控制台中检查出错的对象。...如果在调用堆栈上没有 Flutter 回的情况下发生错误(这里可以理解为FlutterError.onError仅仅可以捕获主线程的错误,而其他异步线程的错误则需要Zone来捕获),它们由发生区域的...Zone 在默认情况下仅会打印错误,而不会执行其他任何操作。 这些回方法都可以被重写,通常在 void main() 方法中重写。 下面来看看如何处理。...//处理错误 }); } 请注意,如果你的应用在 runApp 中调用了 WidgetsFlutterBinding.ensureInitialized() 方法来进行一些初始化操作(例如 Firebase.initializeApp

    2.6K10

    装饰者模式Decorator

    缺点 1、产生很多的小对象,增加了系统的复杂性 2、这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐...因为RecyclerView没有给我们封装好item的点击事件,这里需要自己在adapter中实现item点击事件的回,此处就不细讲改点咯~~~ 加载更多的布局装饰的步骤主要如下:...,service类增添了不少自身特有的方法,而在Internal API中,在attach()方法中attachBaseContext(context)就是调用的父类ContextWrapper中的方法...Context的实现类ContextImpl或其子类的方法,这就是同一基类扩展出来的装饰者内部通过一个被装饰者的引用调用方法,从而丰富被装饰者功能的装饰者模式了。...(Intent intent)方法,虽然在Service中没有该方法,但调用的其实是父类ContextWrapper中的startActivity(Intent intent),该方法如下:

    63030

    Android开发之漫漫长途 XV——RecyclerView

    RecyclerView重写的draw()方法,随后super.draw()即调用View的draw(),该方法会先调用onDraw()(这个方法RecyclerView重写了),再调用dispatchDraw...在RecyclerView的onDraw()方法中会得到分割线的数目,并循环调用其onDraw()方法,我们再来看分割线实例DividerItemDecoration的onDraw()方法 @Override...(该方法在Adapter与RecyclerView相关联时回),如下: @Override public void onAttachedToRecyclerView(RecyclerView recyclerView...(该方法在Adapter与RecyclerView相关联时回),如下: @Override public void onViewAttachedToWindow(RecyclerView.ViewHolder...RecyclerView中缓存策略最重要的方法,该方法RecyclerView的回收机制实现类Recycler中获取合适的View,或者新创建一个View View getViewForPosition

    2.3K20

    Jetpack 系列之Paging3,看这一篇就够了~

    从上图可以知道,load的方法 是我们通过Paging的配置自动触发的,不需要我们每次去调用,那么我们如何来使用DataSource呢?...这句话翻译过来的意思就是:Pager对象PagingSource对象调用load()方法,为它提供LoadParams对象,并作为回报接收LoadResult对象。...,当网络不好的时候,可以考到页面的框架,从而提升用户体验 还有一些其他参数这里就不一一介绍了,构造方法的源码中可以看出pageSize这个参数是必填的,其他的是可选项,所以我们这里传了1 定义RecycleViewAdapter...LoadState的值有三种,分别是NotLoading:当没有加载动作并且没有错误的时候 Loading和Error顾名思义即对应为正在加载 和加载错误的时候,监听方式除了addLoadStateListener...,我们直接使用一个高阶函数回即可。

    3.4K10

    Kotlin入门(23)适配器的进阶表达

    前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统自动回收相应的视图对象。...所以ViewHolder便应运而生,它在列表项首次初始化时,就将其视图对象保存起来,后面再次加载该视图时,即可直接持有者处获得先前的视图对象,从而减少了系统开销,提高了系统的运行效率。...    //绑定视图持有者中的各个控件对象,需要子类重写     override abstract fun onBindViewHolder(holder: RecyclerView.ViewHolder...、onCreateViewHolder、onBindViewHolder三个方法,以及视图持有者的类定义 class RecyclerGridAdapter(context: Context, private...对于第一个的布局编码,可以考虑将其作为一个整型的输入参数;对于第二个的数据结构,可以考虑定义一个模板类,在外部调用时再指定具体的数据类;对于第三个的bind方法,若是Java编码早已束手无策,现用Kotlin

    1.8K41

    已中招!Android 基础面试常常吊死在这几个问题上……

    BuildType 定义了 Gradle 在构建和打包 Android 应用时使用的属性。...通常,这是我们创建视图,包中获取数据等的地方。 OnStart():在Activity对用户可见时调用。...只要 Activity 对用户可见(通常在 onCreate() 或 onRestart() 之后),就会调用 onStart() 方法。...17、面试官:RecyclerView 它是怎么工作的? 应聘者:它是一个列表,有自己的适配器,在 onBindViewHolder 方法中进行数据的绑定的! 面试官:我给你补充一下!...在 ListView 中, findViewById() 在滚动 ListView 期间,代码可能频繁调用,这可能降低性能。即使适配器返回膨胀视图以进行回收,仍然需要查找元素并进行更新。

    2K20

    MVVM、RxJava、Retrofit三剑合璧,事半功倍

    如果是MVP遇到ui更改,就可能需要改变获取控件的方式,改变更新ui的接口,改变ui上获取输入的代码,可能还需要更改访问控件对象的属性代码等等,非常麻烦。...:主要演示多类型RecyclerView列表Adapter的写法 (4)粉丝列表:网络获取数据,主要演示RxJava+Retrofit的基本使用方法 构建 废话讲了这么多,下面开始正式搭建MVVM应用...这里和传统写法不太一样,不是直接调用Activity的setContentView方法,而是调用DataBindingUtil.setContentView。...onBindViewHolder()方法中,会为每一个Layout.xml绑定一个VariableId(就是ViewModel的id),而这个VariableId是每个T类型Bean里取出来的,这里为什么放在...然后调用RetrofitManager的Create方法创建Service实例。 ? 至于它是怎么创建实例的先不用管,反正我们拿到了这个Service实例就可以调用它的方法了。 ?

    2.5K40
    领券