Arhn - архитектура программирования

ViewPager аварийно завершает работу при возобновлении фрагмента с веб-просмотром

Вот моя иерархия представлений:

  • CoordinatorLayout
    • AppBarLayout
    • ViewPager
      • 4 fragments

Первый фрагмент имеет WebView (корень WebView).

При очень быстром переходе между страницами я в конечном итоге получаю эту ошибку (происходит случайно или в определенном месте, которое я не могу понять), проводя пальцем от фрагмента с WebView или к нему.

Если я пролистываю фрагменты, не содержащие WebView, он работает нормально, независимо от того, как быстро и сколько раз я пролистываю.

Трассировки стека:

java.lang.IndexOutOfBoundsException: getChildDrawingOrder() returned invalid index 1 (child count is 1)
    at android.view.ViewGroup.getAndVerifyPreorderedIndex(ViewGroup.java:2055)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4190)
    at android.view.View.draw(View.java:21956)
    at android.view.View.updateDisplayListIfDirty(View.java:20830)
    at android.view.View.draw(View.java:21685)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.updateDisplayListIfDirty(View.java:20821)
    at android.view.View.draw(View.java:21685)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.updateDisplayListIfDirty(View.java:20821)
    at android.view.View.draw(View.java:21685)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4217)
    at android.view.View.draw(View.java:21956)
    at androidx.viewpager.widget.ViewPager.draw(ViewPager.java:2426)
    at android.view.View.updateDisplayListIfDirty(View.java:20830)
    at android.view.View.draw(View.java:21685)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.updateDisplayListIfDirty(View.java:20821)
    at android.view.View.draw(View.java:21685)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.updateDisplayListIfDirty(View.java:20821)
    at android.view.View.draw(View.java:21685)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.updateDisplayListIfDirty(View.java:20821)
    at android.view.View.draw(View.java:21685)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.updateDisplayListIfDirty(View.java:20821)
    at android.view.View.draw(View.java:21685)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.updateDisplayListIfDirty(View.java:20821)
    at android.view.View.draw(View.java:21685)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.updateDisplayListIfDirty(View.java:20821)
    at android.view.View.draw(View.java:21685)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.updateDisplayListIfDirty(View.java:20821)
    at android.view.View.draw(View.java:21685)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.updateDisplayListIfDirty(View.java:20821)
    at android.view.View.draw(View.java:21685)
    at android.view.ViewGroup.drawChild(ViewGroup.java:4432)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4193)
    at android.view.View.draw(View.java:21956)
    at com.android.internal.policy.DecorView.draw(DecorView.java:795)
    at android.view.View.updateDisplayListIfDirty(View.java:20830)
    at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:575)
    at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:581)
    at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:654)
    at android.view.ViewRootImpl.draw(ViewRootImpl.java:3761)
    at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3489)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2777)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1745)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7730)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:966)
    at android.view.Choreographer.doFrame(Choreographer.java:725)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:951)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7116)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925)

Ответы:


1

Мне трудно понять, почему вы получаете IndexOutOfBoundException, не видя некоторых частей вашего кода. Однако я могу предположить, что когда загружается Fragment с WebView, он пытается использовать какой-то ресурс, который пока недоступен. Поэтому я хотел бы предложить обходной путь.

Вы можете установить setOffscreenPageLimit так, чтобы он не перезагружал фрагменты, даже если вы проведете пальцем вниз до конца. Пример кода следующий.

ViewPager mViewpager = (ViewPager)findViewById(R.id.viewpager)
mViewPager.setOffscreenPageLimit(3);

Надеюсь, это решит вашу проблему.

22.05.2019
  • Это означало бы, что в памяти будет храниться больше фрагментов, что не является лучшим обходным путем, я думал об этом, но колебался. Я предпочитаю пытаться заставить его работать чище 22.05.2019
  • Было бы здорово, если бы вы также разместили часть своего соответствующего кода. :) 22.05.2019
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..