2012-01-13 25 views
9

非常に複雑なUIを持つアプリケーションがあり、多くの場合、入れ子になったlayoutsが多数含まれています。こんにちはAndroid:呼び出しスタックサイズを増やす

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <FrameLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <FrameLayout 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" > 

      <!-- ...So on 30 times... --> 

       <FrameLayout 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" > 

       </FrameLayout> 

      <!-- ...So on 30 times... --> 

     </FrameLayout> 
    </FrameLayout> 
</FrameLayout> 

主な活動のためにxmlを以下で世界のアプリケーションがにStackOverflowErrorしばらくの原因となる)

1:別のレイアウトを作成している間、私は疑問に思うStackOverflowError

をキャッチしてきた、私は2つの試験例を作成しましたレイアウトを描画する(すべてのレイアウトが再帰的に子を描画するため)

2)次のテストケース

public class TestOverflowActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     overflow(0); 
    } 

    private void overflow(int i){ 
     android.util.Log.i("Stack depth:", " = " + i); 
     overflow(i+1); 
    } 
} 

は、StackOverflowErrorが深さ約260-270コールの原因となります。

2番目のテストケースのスタック要素を呼び出すたびに、パラメータ= 8 bytesの戻りアドレス+ 4 bytesには4バイトかかります。 Dalvik's VMはすべての要素でさらに多くの情報を保持する可能性がありますが、合計スタックサイズを最大限にするためには16 bytes per element * 260 calls = about 4Kbytesさえあります。これでは十分ではないようです。

最大スタックサイズを増やす方法はありますか?

答えて

22

メインUIスレッドでコールスタックサイズを増やすことはできませんが(ここではできるだけ少ないと思われるのでわかります)、別のスレッドで行うことができますThreadオブジェクトのコンストラクタのパラメータから:私は2M(に8K(260周りの呼び出し)からの私のスタックのサイズを増加させた。この例では

ThreadGroup group = new ThreadGroup("threadGroup"); 
new Thread(group, runnableObject, "YourThreadName", 2000000).start(); 

StackOverflowExceptionがを取得するには十分ではないため、もちろん、あなたが好きなだけを追加することができます限り、メモリがそれを取ることができる限り)、最終的には、さらなる読者のために、これはあなたのスタックサイズを増やす方法ですが、推奨されませんが、実際には、例えば、もちろんあなたが指定したスタックサイズでワーカースレッドのすべての苦労をして、メインUI Thread with Handlersまたはあなたが望む任意のメカニズムを使用してUIの変更を "ポスト"するだけですそれと対話するために使用してください...

希望がこれを助ける...

よろしく!

+0

真実ですが、これは良い答えだと思いますが、私はスタックサイズを尊重することは保証されていないと思いますか?できるだけ完全に状況を避けるのが最善の方法です。 –

+0

完全に同意しますが、最後のリソースとして必要であれば知ることは可能です –

-1

この複雑なレイアウトが必要な場合(多くの人は疑問に思うが)、onCreateメソッドでそれをプログラム的に描画することができます。

0

あなたは間違いなくその中にレイアウトをネストしたくありません。自分自身が3〜4回ネスティングしていると、ビューの構築はますます少なくなり、アクティビティの遷移が開始される可能性があります。ビューが作成される前に終了する可能性があります。奇妙に見えるか、または活動の移行の完全な浪費になります。

ルートレイアウトを相対レイアウトにし、すべてのフレームレイアウトをそのルート相対レイアウトの子として設定する必要があります。