2012-01-13 43 views
9

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

Trả lời

22

Bạn có thể không tăng kích thước ngăn xếp cuộc gọi trong Chủ đề giao diện người dùng chính (có thể hiểu được vì bạn phải làm ít điều nhất có thể tại đây), nhưng bạn có thể làm điều đó trong một chuỗi riêng biệt bằng cách sử dụng các thông số nhà xây dựng các đối tượng Thread của:

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

với ví dụ này tôi tăng kích thước ngăn xếp của tôi từ 8k (khoảng 260 cuộc gọi) để 2M (đủ cho không để có được những StackOverflowException, tất nhiên bạn có thể thêm nhiều như bạn muốn miễn là bộ nhớ có thể lấy nó), do đó, cuối cùng, cho độc giả hơn nữa, đây là cách bạn có thể tăng kích thước ngăn xếp của bạn, mặc dù không được khuyến khích, trong một số trường hợp nó thực sự cần thiết ví dụ như một thuật toán với recursi rộng rãi đã thực hiện các cuộc gọi và tất nhiên bằng cách thực hiện tất cả công việc khó khăn trong một chuỗi công việc (như bạn phải làm) với kích thước ngăn xếp được chỉ định của bạn và chỉ thay đổi "đăng" trong giao diện người dùng bằng cách sử dụng Giao diện người dùng chính với Trình xử lý hoặc bất kỳ cơ chế nào bạn muốn sử dụng để tương tác với nó ...

Hy vọng điều này sẽ giúp ...

Kính trọng!

+0

Đú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ể. –

+0

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 ... –

-1

Nếu bạn cần bố cục phức tạp này (như nhiều người sẽ nghi ngờ) bạn vẫn có thể vẽ nó theo chương trình trong phương thức onCreate.

0

Bạn chắc chắn không muốn lồng bố trí vào nhau như thế. Nếu bạn thấy mình làm tổ ba hoặc bốn lần thì việc xây dựng chế độ xem trở nên kém hiệu quả, điều này có thể khiến quá trình chuyển đổi hoạt động bắt đầu và có thể trong trường hợp của bạn kết thúc trước khi chế độ xem được tạo. Mà sẽ trông kỳ lạ, hoặc là một sự lãng phí hoàn toàn của một quá trình chuyển đổi hoạt động.

Bạn nên bố trí bố cục gốc bố cục tương đối và có tất cả bố cục khung của bạn dưới dạng con của bố cục tương đối gốc đó.

Các vấn đề liên quan