2012-06-08 17 views
9

मैं लगभग 50 वेबव्यू लोड करने के लिए व्यूअरजर का उपयोग कर रहा हूं ... सभी वेबव्यूज़ assests में लोड किए गए हैं और प्रत्येक अवलोकन में एक HTML पृष्ठ है जो लगभग 70 छवियों तक पहुंच रहा है ... जैसा कि मैं स्वाइप करता हूं, ऐप लगभग 30 पृष्ठों के बाद दुर्घटनाग्रस्त हो रहा है, हो सकता है कि वेबव्यू के गुण अभी भी सहायक फ़ोल्डर में छवियों का संदर्भ रखें ... क्या उस वेबव्यू को रिलीज़ करने का कोई तरीका है जिसे व्यूपागर उस विशेष समय पर उपयोग नहीं कर रहा है?व्यूपार्जर वेबव्यू मेमोरी इश्यू

awesomePager.setAdapter(new AwesomePagerAdapter(this, webviewdata)); 

विवरण:

Android WebView Memory Leak when loading html file from Assets 
Failed adding to JNI local ref table (has 512 entries) 
"Thread-375" prio=5 tid=15 RUNNABLE 

जबकि गतिशील viewpager पर वेबव्यू लोड हो रहा है

Logcat: समय बिटमैप की bitmap.Most नीचे पैमाने पर करने के enter image description here

उत्तर

1

कोशिश एक मुख्य कारण है हम मेमोरी मुद्दा प्राप्त करें। बिटमैप्स को रीसायकल करने के तरीके के बारे में भी जानें। निम्नलिखित स्निपेट आपकी मदद करेगा।

BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(filename, options); 
     options.inJustDecodeBounds = false; 
     options.inSampleSize = 2; 

     bitmap = BitmapFactory.decodeFile(filename, options); 
     if (bitmap != null && exact) { 
      bitmap = Bitmap.createScaledBitmap(bitmap, width, height, false); 
     } 

यह भी सुनिश्चित करें कि आपने निम्न विधि को ओवरराइड किया है।

@Override 
public void destroyItem(View collection, int position, Object view) { 
    ((ViewPager) collection).removeView((TextView) view); 
} 

या आप बिटमैप

private byte[] resizeImage(byte[] input) { 

    if (input == null) { 
     return null; 
    } 

    Bitmap bitmapOrg = BitmapFactory.decodeByteArray(input, 0, input.length); 

    if (bitmapOrg == null) { 
     return null; 
    } 

    int height = bitmapOrg.getHeight(); 
    int width = bitmapOrg.getWidth(); 
    int newHeight = 250; 

    float scaleHeight = ((float) newHeight)/height; 

    // creates matrix for the manipulation 
    Matrix matrix = new Matrix(); 
    // resize the bit map 
    matrix.postScale(scaleHeight, scaleHeight); 

    // recreate the new Bitmap 
    Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, 
      width, height, matrix, true); 

    bitmapOrg.recycle(); 

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    resizedBitmap.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, bos);    

    resizedBitmap.recycle(); 

    return bos.toByteArray();    
}  
+1

आपके सोलन के लिए धन्यवाद, लेकिन ऊपर सवाल वेबव्यू के लिए है !!! –

+1

@ विपुल हां मैंने नष्ट कर दिया है Item, अभी भी कोई भाग्य नहीं है। – Kiran

0

WebView JNI के साथ काम करता है और यह केवल पकड़ 512 स्थानीय संदर्भ, सीधे वेब से अपनी सामग्री को लोड करने का प्रयास कर सकते हैं और इस समस्या shouldn नीचे स्केल करने के लिए एक समारोह बना सकते हैं नहीं होगा

मुझे यह समस्या तब मिलती है जब मैं shouldInterceptRequest(WebView view, String url)वेबव्यूक्लिएंट में ओवरराइड करता हूं और अपने स्वयं के कैशिंग तंत्र से स्थानीय संदर्भ देता हूं।

यह वेबव्यू में स्वयं एक बग हो सकता है। कम से कम यह नहीं है कि अगर आप मुझसे पूछें तो इसका व्यवहार कैसे करना चाहिए।

0

सॉफ़्टवेयर कार्यों के लिए वेबदृश्य की परत प्रकार सेट करना।

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
} 

लेकिन अब आप हार्डवेयर त्वरण खो देते हैं और आपका वेबव्यू धीमा हो सकता है।

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