2012-01-13 2 views
9

매우 복잡한 UI를 가진 응용 프로그램을 가지고 있습니다. 다른 응용 프로그램을 많이 포함하여 많은 layouts을 포함하고 있습니다. 다른 레이아웃을 만드는 동안, I는 StackOverflowErrorAndroid : 호출 스택 크기 늘리기

가 궁금 잡았습니다 나는 두 개의 테스트 예제 만들었습니다 주요 활동에 대한 xml을 다음과

1) 안녕하세요 세계 응용 프로그램을

<?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> 

는 StackOverflowError가있는 동안 발생 레이아웃 그리기 (모든 레이아웃이 재귀 적으로 자식을 그려야하므로)

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 전화를 발생시킵니다.

두 번째 테스트 케이스의 스택 요소 호출마다 매개 변수 = 8 bytes의 반송 주소 + 4 bytes에 대해 4 바이트가 소요됩니다. Dalvik's VM이 모든 요소에서 더 많은 정보를 유지할 수 있지만 전체 스택 크기를 최대화하려면 16 bytes per element * 260 calls = about 4Kbytes 일 수도 있습니다. 이것은 충분하지 않습니다.

최대 스택 크기를 늘릴 수있는 방법이 있습니까?

답변

22

기본 UI 스레드에서 호출 스택 크기를 늘릴 수 없을 수도 있지만 (여기서는 가능하지 않으므로 이해할 수 있음) 사용 방법을 별도의 스레드에서 수행 할 수 있습니다 스레드 객체의 생성자 파라미터 : 나는 2M (에 8K (260 주위 통화)에서 내 스택 크기를 증가 예와

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

있는 StackOverflowException를 얻기 위해 충분하지 위해, 물론 당신은 당신이 원하는만큼 추가 할 수 있습니다 만큼 메모리가 걸릴 수 있습니다), 그래서 더 많은 독자를 위해, 이것은 권장되지는 않지만 스택 크기를 늘릴 수있는 방법입니다. 실제로 어떤 경우에는 광범위한 재귀가있는 알고리즘 물론 당신이 지정한 스택 크기로 작업자 스레드 (모든 작업)를 수행하고 UI 핸들러가 포함 된 기본 UI 스레드 또는 원하는 메커니즘을 사용하여 UI의 변경 사항을 "게시"하면됩니다 그것과 상호 작용하는 데 사용 ...

희망이 도움이 ...

감사합니다!

+0

사실 나는 스택 크기를 존중한다는 보장은 없지만 이것이 좋은 대답이라고 생각합니다. 가능한 경우 상황을 완전히 피하는 것이 가장 좋습니다. –

+0

전적으로 동의합니다. 그러나 필요한 경우 마지막 리소스로 알아 두는 것이 좋습니다 ... –

-1

복잡한 레이아웃이 필요한 경우 (많은 사람들이 의심 스러울 것입니다) onCreate 메소드에서 여전히 프로그램 방식으로 그릴 수 있습니다.

0

레이아웃을 서로 안에 중첩시키지 않으실 것입니다. 3 ~ 4 번 중첩되는 경우보기의 구성이 점점 더 효율적이지 않게되어 활동 전환이 시작될 수 있으며보기가 작성되기 전에 끝내기도합니다. 이상하게 보일 지, 또는 활동 전환의 완전한 낭비가 될 것입니다.

루트 레이아웃을 상대 레이아웃으로 만들고 모든 프레임 레이아웃을 해당 루트 상대 레이아웃의 하위로 유지해야합니다.