java.lang.IllegalStateException: уже в пуле - PullRequest
2 голосов
/ 21 апреля 2019

Я сталкиваюсь с этим странным крахом. Вот аварийный стек. Я не могу понять, почему происходит сбой, и я также не могу воспроизвести этот сбой. Это происходит на notifyItemChanged(i)

  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)

1 Ответ

0 голосов
/ 24 апреля 2019

Один из следующих двух вариантов может решить вашу проблему:

Сначала попытайтесь установить для SupportsChangeAnimations значение false для recyclerView:

((SimpleItemAnimator) RecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);

В противном случае попробуйте установить ItemAnimator на ноль:

recyclerView.setItemAnimator(null);

Возможные пути, откуда может прийти ошибка:

Пока recycleview хочет анимировать постоянные элементы, он вызывает метод dispatchLayout (). В этом методе он будет проверять наличие прогнозирующих анимаций, и если он установлен в значение false, он будет пытаться использоватьUpdatesInOnePass () из класса AdapterHelper. А в классе AdapterHelper он попытается отложить обновления, вызвав потреблениеPostponedUpdates. Таким образом, если какой-либо предмет уже переработан, то он выдаст ошибку уже в пуле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...