Tôi có một ứng dụng có giao diện người dùng rất phức tạp, chứa nhiều số layouts
lồng nhau trong một giao diện người dùng khác. Trong khi Tạo bố trí khác, tôi đã bắt gặp một StackOverflowError
Android: Tăng kích thước ngăn xếp cuộc gọi
Tự hỏi, tôi đã tạo ra hai ví dụ kiểm tra:
1) Xin chào các ứng dụng trên thế giới với sau xml
cho hoạt động chính
<?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>
gây StackOverflowError khi vẽ bố cục (khiến mỗi bố cục đệ quy vẽ nó là con cái)
2) Trường hợp kiểm tra sau
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);
}
}
gây ra StackOverflowError
về độ sâu khoảng 260-270 cuộc gọi.
Mọi cuộc gọi của phần tử ngăn xếp đối với trường hợp thử nghiệm thứ hai mất 4 byte cho địa chỉ trả lại + 4 bytes
cho tham số = 8 bytes
. Có thể là Dalvik's
VM giữ thêm một chút thông tin trong mọi phần tử, nhưng thậm chí là 16 bytes per element * 260 calls = about 4Kbytes
cho kích thước tổng thể tối đa. Điều này dường như không đủ.
Có cách nào để tăng kích thước ngăn xếp tối đa không?
Đúng, và tôi nghĩ đây là câu trả lời hay, mặc dù tôi không nghĩ rằng nó được đảm bảo tôn trọng kích thước ngăn xếp? có lẽ tốt nhất để tránh tình huống hoàn toàn nếu có thể. –
Hoàn toàn đồng ý, nhưng nó là tốt để biết là có thể nếu cần thiết như tài nguyên cuối cùng ... –