Я получаю java.lang.StackOverflowErrors, когда рисуется иерархия просмотров:
at android.view.View.draw(View.java:6880)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
at android.view.View.draw(View.java:6883)
at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
...
Исследование указывает на то, что иерархия моего представления слишком глубока для Android. Действительно, используя Иерархический просмотрщик, я вижу, что мое самое длинное вложение - 19 (!)
Мое приложение выглядит как приложение Google Play Store (с вкладками салфетки). Каждая вкладка представляет собой вложенный фрагмент внутри плейера просмотра фрагментов - с поддержкой v4 и HoloEverywhere. Очевидно, именно поэтому моя иерархия немного сошла с ума.
Мои вопросы:
-
Каков реальный размер размера стека? Я не нашел способа измерить размер стека потока пользовательского интерфейса. Некоторые слухи в сети говорят, что 8 КБ, но есть ли способ правильно измерить это на некоторых образцах?
-
Изменяется ли ограничение размера стека с ОС ver? Такая же иерархия не сбой на устройстве 4.0.3, а сбой на устройстве 2.3.3 (идентичное оборудование). Почему это?
-
Есть ли какое-либо решение, кроме оптимизации иерархии вручную? Я не нашел возможности увеличить смехотворно небольшой стек потока пользовательского интерфейса. Извините, но ограничение кадров в 60-100 кадров - это шутка.
-
Предполагая, нет ли чудо-решение на # 3, какие-либо рекомендации о том, где должна выполняться оптимизация иерархии ядра?
-
Сумасшедшая идея - я заметил, что каждый уровень представления добавляет около 3 вызовов функций (View.draw, ViewGroup.dispatchDraw, ViewGroup.drawChild). Может быть, я могу сделать свою собственную реализацию ViewGroup (настраиваемые макеты), которая менее расточительна для стека во время draw()?