【问题标题】:java.lang.IllegalStateException: Already in the pooljava.lang.IllegalStateException:已经在池中
【发布时间】:2019-04-21 13:48:39
【问题描述】:

在回收物品时,我在回收站视图的 prod 上遇到了这个奇怪的崩溃,我也无法重现这个崩溃。

  Fatal Exception: java.lang.IllegalStateException: Already in the pool!
   at androidx.core.util.Pools$SimplePool.release(Pools.java:117)
   at androidx.recyclerview.widget.AdapterHelper.recycleUpdateOp(AdapterHelper.java:743)
   at androidx.recyclerview.widget.AdapterHelper.recycleUpdateOpsAndClearList(AdapterHelper.java:750)
   at androidx.recyclerview.widget.AdapterHelper.consumePostponedUpdates(AdapterHelper.java:123)
   at androidx.recyclerview.widget.AdapterHelper.consumeUpdatesInOnePass(AdapterHelper.java:557)
   at androidx.recyclerview.widget.RecyclerView.processAdapterUpdatesAndSetAnimationFlags(RecyclerView.java:3585)
   at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3829)
   at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3639)
   at androidx.recyclerview.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1877)
   at androidx.recyclerview.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:5044)
   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1092)
   at android.view.Choreographer.doCallbacks(Choreographer.java:893)
   at android.view.Choreographer.doFrame(Choreographer.java:809)
   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1078)
   at android.os.Handler.handleCallback(Handler.java:891)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:207)
   at android.app.ActivityThread.main(ActivityThread.java:7539)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)

【问题讨论】:

  • 所以没有与您的应用代码相关的堆栈跟踪?
  • @user158 没有与应用程序相关的堆栈跟踪
  • 如果您使用最新的 RV 版本,请移回旧版本,否则请移至较新版本。
  • @user158 这是较新版本的 androidX
  • 什么是 RV 版本?

标签: android android-recyclerview


【解决方案1】:

当两个不同的线程试图访问您的回收视图实例以更新它时,将引发异常。

让我们澄清一下。假设线程 A 去更新你的回收视图然后下一个线程 B 尝试做和 A 一样的事情。结果,抛出异常,说 A 已经在池中 (Already in the pool!)

经过一些研究,为了找到解决方案,我找到了这些方法

Synchronized Methods

synchronized(recycleview)
{

}

Pools.SynchronizedPool

使用androidx.core.util.Pools.SynchronizedPool<T> 代替androidx.core.util.Pools.SimplePool

这两种方法都尝试同步访问关键部分以避免引发异常。

【讨论】:

    【解决方案2】:

    您正在计算 recyclerView 时对其进行更新。 你应该这样做:

    if (recyclerView != null) {
                recyclerView.post(new Runnable() {
                    @Override
                    public void run() {
                        notifyDataSetChange(); //whatever you use, insert, remove, itemChanged etc...
                    }
                });
            }
    

    【讨论】:

      【解决方案3】:

      我的问题的根源是

      thisRecycler?.getRecycledViewPool()?.clear() 调用太频繁以至于没有在这一行执行同步操作

      它被引入作为替代

      notifyItemRangeRemoved(0, previousContentSize)
      .
      .
      notifyItemRangeInserted(0, newRecyclerContent.size - 1)
      

      现在代码稳定了

      notifyItemRangeRemoved(0, previousContentSize)
      .
      .
      notifyDataSetChanged()  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-27
        • 1970-01-01
        • 2021-12-24
        • 2016-04-16
        • 2023-01-12
        • 2018-01-20
        • 2013-03-18
        相关资源
        最近更新 更多