メイン UI スレッド (関連する質問)で StackOverflowErrors に苦労しています。私のアプリは Android 2.3 以降を対象としています。Android 4 ではすべて問題ありませんが、2.3.3 でビュー レイアウトを描画するとクラッシュします。
明白な答えは、ビュー レイアウトを最適化し、ネストされたビューの数を減らすことです。これは問題です。ビューの数が多いのは、サポート ライブラリとタブのフラグメントを使用しているためです。これは推奨されるアプローチです。古いバージョンの OS ではスタックが小さいという理由だけで、設計を変更してフラグメントをドロップしたくありません。
UI スレッドのスタック サイズを増やす方法を探しています。これは不可能であるという回答を見てきましたが、マニフェストにそうするための簡単な設定がないことを理解しています。しかし、手動による回避策がないことにまだ満足していません。
これまでの私の最高のアイデア:
より大きなスタックで新しいワーカー スレッド (Thread クラス) を作成します。ワーカー スレッドのスタック サイズを増やすことができます。次に、このスレッドを何らかの方法で新しい UI スレッドに変換します。どのように?
android.app.Activity .attach(..)の Android ソースを参照すると、アクティビティが UI スレッドにアタッチされていることがわかりました。接続されているスレッドを置き換えて、「新しい」UIスレッドに変更する方法があるかもしれません
android.app.ActivityThread .startActivityNow(..)をもう少し掘り下げると、アクティビティを手動で開始できるようになるかもしれません。アクティビティが作成されると、作成されたスレッドに自動的にアタッチされます。新しい UI スレッドからこれを実行すると、うまくいくかもしれません。
新しい UI スレッドを作成する場合、そのためのルーパーを手動で作成する必要があります。android.app.ActivityThread .main(..)から作成する必要があるものを感じています
その他のアイデア:
StackOverflowError を手動でキャッチし、それが発生した場合は呼び出しを非同期に移動して、スタックが小さくなるようにします。ここでこの素晴らしいアイデアを見てきましたが、機能させることができませんでした。
NDK スレッド (JNI 経由) には大きなスタックがあります。私は自分の利益のためにそれらを使用することを考えましたが、これを行う方法がわかりません. JNI 経由の呼び出しはすべて独自のスレッドで実行されるため、UI アクセスに NDK スレッドを使用する方法がわかりません。
そう..
これはまったく悪い考えだと言うことを除いて、他の提案やヒントはありますか? 似たようなことをした人を見つけることができますか?私はできませんでした..