2012-01-13 33 views
9

मेरे पास बहुत ही जटिल यूआई वाला एक एप्लीकेशन है, जिसमें layouts एक दूसरे में घोंसला है। जबकि एक और लेआउट बनाना, मैं एक StackOverflowErrorएंड्रॉइड: कॉल स्टैक आकार बढ़ाएं

सोच पकड़ा गया है, मैं दो परीक्षण उदाहरण तैयार किए:

1) मुख्य गतिविधि के लिए xml निम्नलिखित के साथ नमस्ते दुनिया आवेदन

<?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 वीएम अधिकतम तत्वों के लिए प्रत्येक तत्व में थोड़ी अधिक जानकारी रखता है, लेकिन अधिकतम समग्र स्टैक आकार के लिए 16 bytes per element * 260 calls = about 4Kbytes भी। यह पर्याप्त प्रतीत नहीं होता है।

अधिकतम स्टैक आकार बढ़ाने का कोई तरीका है?

उत्तर

22

आप मुख्य यूआई थ्रेड में कॉल स्टैक आकार को बढ़ाने में सक्षम नहीं हो सकते हैं (जो समझ में आता है क्योंकि आपको यहां जितनी संभव हो उतनी चीजें करना चाहिए), लेकिन आप इसे उपयोग करके एक अलग थ्रेड में कर सकते हैं थ्रेड वस्तु के निर्माता मापदंडों के:

ThreadGroup group = new ThreadGroup("threadGroup"); 
new Thread(group, runnableObject, "YourThreadName", 2000000).start(); 
इस उदाहरण मैं 8k (260 के आसपास कॉल) से 2 एम (करने के लिए अपने ढेर आकार में वृद्धि के साथ

StackOverFlowException नहीं करने के लिए पर्याप्त के लिए, बेशक आप जितना आप चाहते हैं के रूप में जोड़ सकते हैं जब तक स्मृति इसे ले जा सके), अंत में, आगे के पाठकों के लिए, इस तरह आप अपना स्टैक आकार बढ़ा सकते हैं, हालांकि इसकी अनुशंसा नहीं की जाती है, कुछ मामलों में यह वास्तव में आवश्यक है उदाहरण के लिए व्यापक रिकर्सि के साथ एक एल्गोरिदम आपके निर्दिष्ट स्टैक आकार के साथ एक कार्यकर्ता थ्रेड (जैसा कि आपको माना जाता है) में सभी कड़ी मेहनत करके और निश्चित रूप से हैंडलर के साथ मुख्य यूआई थ्रेड का उपयोग करके यूआई में "पोस्टिंग" परिवर्तन या जो भी तंत्र आप चाहते हैं इसके साथ बातचीत करने के लिए ...

आशा इस मदद करता है ...

सादर का उपयोग करें!

+0

सच है, और मुझे लगता है कि यह एक अच्छा जवाब है, हालांकि मुझे नहीं लगता कि यह स्टैक आकार का सम्मान करने की गारंटी है? संभवतः पूरी तरह से स्थिति से बचने के लिए सबसे अच्छा है। –

+0

पूरी तरह से सहमत हैं, लेकिन यह जानना अच्छा है कि अंतिम संसाधन के रूप में आवश्यक होने पर यह संभव है ... –

-1

आप इस जटिल लेआउट की जरूरत है (के रूप में कई संदेह होगा) यदि आप अभी भी onCreate विधि में programticaly यह आकर्षित कर सकते हैं।

0

आप निश्चित रूप से इस तरह के एक दूसरे के अंदर लेआउट घोंसला नहीं करना चाहते हैं। यदि आप खुद को तीन या चार बार घोंसले पाते हैं तो दृश्य का निर्माण कम और कम कुशल हो जाता है, जिससे गतिविधि संक्रमण शुरू हो सकता है और शायद आपके मामले में दृश्य बनने से पहले खत्म हो सकता है। जो अजीब लगेगा, या एक गतिविधि संक्रमण का पूरा अपशिष्ट होगा।

आपको अपने रूट लेआउट को सापेक्ष लेआउट बनाना चाहिए और उस रूट रिश्तेदार लेआउट के बच्चों के रूप में अपने सभी फ्रेम लेआउट रखना चाहिए।

संबंधित मुद्दे