2011-03-29 27 views
5

मेरे पास एक सर्वर/क्लाइंट ऐप है जहां मैं सर्वर से डेटा को हेसियन/हेसड्रॉइड के माध्यम से पुनर्प्राप्त करता हूं। डेटा हैशमैप्स के साथ बहुत जटिल है जिसमें अन्य हैशमैप्स और बाइट एरे में संग्रहीत छवियां हैं। मैं डेटा को पूरी तरह प्रदर्शित कर सकता हूं।हैश मैप डी-सीरियलाइजेशन

हमेशा सर्वर से पूछताछ करने के लिए, मैं एक डेटा संरचना को कैश के रूप में उपयोग कर रहा हूं। ऐप बंद करते समय ऑब्जेक्टऑटपुटस्ट्रीम का उपयोग करके मैं यह डेटा ऑब्जेक्ट एसडी कार्ड में सहेजता हूं। जब मैं इसे पुनरारंभ करता हूं, तो मैंने इसे ऑब्जेक्ट इनपुटपुट के साथ स्मृति में वापस पढ़ा।

मुझे एसडी कार्ड से डेटा पढ़ने के बाद ही ऐप के साथ समस्याएं आ रही हैं। ढेर ~ 17 एमबी ऐप्लिकेशन क्रैश पर बढ़ता है जब

INFO/dalvikvm-heap(4150): Grow heap (frag case) to 10.775MB for 281173-byte allocation 

:

DEBUG/dalvikvm(4150): GetFieldID: unable to find field Ljava/util/HashMap;.loadFactor:F 

और इस में अन्य संदेशों के बीच: LogCat मेरा पीछा निर्गम (100 बार) देता है।

मैंने हैश मैप सीरियलाइजेशन के बारे में कई धागे पढ़े हैं और आर्किटेक्चर के बीच क्रमबद्ध होने पर एक बग प्रतीत होता है, लेकिन मेरे लिए हैसियन के माध्यम से डेटा ट्रांसफर पूरी तरह से काम करता है और डिस्क से हैश मैप्स पढ़ने पर केवल वर्णित समस्याएं हैं I

कोई भी विचार?

+0

कृपया आप जिस कोड को लोड करते हैं और डेटा को डी-सीरियलाइज करते हैं, उसे पोस्ट कर सकते हैं? –

+0

कृपया लॉग बिल्ली का पूरा डंप और श्री अर्ल द्वारा उल्लिखित स्रोत कोड जोड़ें। आपने जो कहा है उससे यह स्मृति समस्या से बाहर की तरह गंध करता है (शायद यह http://code.google.com/p/android/issues/detail?id=14869) की मदद करेगा। –

उत्तर

2

समस्या हैशैप Deserialization से सीधे संबंधित नहीं है, क्योंकि साइबर-भिक्षु टिप्पणी की। एंड्रॉइड में वास्तव में कुछ प्रकार की बग है या यह हैश मैप कार्यान्वयन है, लेकिन मुझे नहीं लगता कि ऐप क्रैश क्यों होता है।

अब तक मैंने ऐप में कम छवियों का उपयोग करके समस्या हल की है। मेरे पास एक गैलरी थी जिसमें उदाहरण के लिए आप एक छवि से दूसरे तक एक फ्लिपर में स्वाइप कर सकते थे और सभी छवियों को एक साथ लोड कर सकते थे। छवियों की एक निश्चित मात्रा में, पर्याप्त ढेर स्थान नहीं है।

मेरा समाधान यह है कि सभी डीकोडेड छवियों को एक साथ में न रखें।

1) स्मृति में द्विआधारी छवि डेटा पकड़ो (एक समस्या नहीं जब तक कि छवियों कि बड़े नहीं हैं)

2) मत द्विआधारी लोड:

इस तरह से किया है यह फ्लीपर के विचार बनाते समय ImageViews में छवि डेटा।

3) प्रदर्शित होने वाली छवि दृश्य में बाइनरी छवि डेटा सेट करें।

4) रखें अगले और बेहतर प्रयोक्ता अनुभव के लिए पिछले imageView)

5) "को अनलोड" ImageViews की बाइनरी छवि डेटा है कि पारदर्शी रंग करने के लिए अपने संसाधन की स्थापना द्वारा प्रदर्शित नहीं होते।

Here's कुछ कोड:

// initialize the viewFlipper by creating blank views 
for (ComponentImageDto listElement : images) { 
    LinearLayout view = renderView(); 
    flipper.addView(view); 
} 
showImage(flipper.getCurrentView()); 

renderView() सिर्फ एक LinearLayout एक imageView

फिर युक्त मैं अगले/पिछले छवि जिसमें मैं बाइनरी डेटा सेट दिखाने के लिए कुछ तरीकों लिखा रिटर्न

private void showNextElement() { 
    // show next flipper view 
    flipper.showNext(); 

    // get current view 
    int displayedChild = flipper.getDisplayedChild(); 
    View currentView = flipper.getCurrentView(); 

    // load the binary data 
    showImage(currentView); 

    // get the next to last view index (if keeping max. 3 images at a time in memory) 
    int otherChild = (displayedChild - 2); 
    if (otherChild < 0) { 
     otherChild = otherChild + flipper.getChildCount(); 
    } 

    // .. and remove it 
    removeImage(flipper.getChildAt(otherChild)); 
} 

private void showPreviousElement() { 
    flipper.showPrevious(); 
    int displayedChild = flipper.getDisplayedChild(); 
    View currentView = flipper.getCurrentView(); 
    showImage(currentView); 
    setTitle((CharSequence) currentView.getTag()); 
    int otherChild = (displayedChild + 2) % flipper.getChildCount(); 
    removeImage(flipper.getChildAt(otherChild)); 
} 

private void removeImage(View view) { 
    ImageView imageView = (ImageView) view.findViewById(R.id.gallery_image); 
    if (imageView != null) { 
     imageView.setImageResource(R.color.transparent); 
     System.gc(); 
    } 
} 

private void showImage(View view) { 
    ImageView imageView = (ImageView) view.findViewById(R.id.gallery_image); 
    if (imageView != null) { 
     bm = BitmapHelper.decodeByteArray(images.get(flipper.getDisplayedChild()).getImage().getBinaryObject()); 
     imageView.setImageBitmap(bm); 
    } 
} 

furtherly स्मृति से निपटने है कि मैं stackoverflow पर पाया BitmapHelper कक्षा में कुछ कोड का उपयोग कर मैं सुधार करने के लिए, कि स्मृति को बचाने के लिए मदद करता है: imageView करने के लिए उनके आकार को कम करके छवियों के लिए।

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