ビュー階層が描画されているときに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 では処理できません。実際、Hierarchy Viewerを使用すると、最長のネストが19ビュー (!)であることがわかります。
私のアプリは、Google Play ストア アプリに似ています (スワイプ タブ付き)。すべてのタブは、v4 サポートと HoloEverywhere を使用して、フラグメント ビュー ページャー内のネストされたフラグメントです。明らかに、これが私のヒエラルキーがおかしくなった理由です。
私の質問:
実際のスタックサイズの制限は? UI スレッドのスタック サイズを測定する方法が見つかりませんでした。ネット上では 8KB という噂もありますが、一部のサンプル デバイスでこれを正確に測定する方法はありますか?
OSのバージョンによってスタックサイズの制限は変わりますか? 同じ階層が4.0.3 デバイスではクラッシュしませんが、2.3.3 デバイス (同一のハードウェア) ではクラッシュします。何故ですか?
階層を手動で最適化する以外に解決策はありますか? UI スレッドの途方もなく小さいスタックを増やす方法が見つかりませんでした。申し訳ありませんが、60 ~ 100 のスタック フレーム制限は冗談です。
#3 に奇跡的な解決策がないと仮定すると、コア階層の最適化をどこで行うべきかについての推奨事項はありますか?
クレイジーなアイデア - すべてのビュー レイヤーが約 3 つの関数呼び出し (View.draw、ViewGroup.dispatchDraw、ViewGroup.drawChild) を追加することに気付きました。draw() 中のスタックの無駄が少ない独自の ViewGroup 実装 (カスタム レイアウト) を作成できるのではないでしょうか?