2017-08-09 9 views
11

उत्पन्न करता है मेरे पास एक कस्टम WebView है और मैं इसकी सामग्री का एक बिटमैप प्राप्त करना चाहता हूं (ऑफस्क्रीन शामिल)।वेबव्यू से बिटमैप प्राप्त करना आउटऑफमेमरी क्रैश

public static Bitmap getBitmapFromWebviewV2(WebView webView) { 
    webView.measure(View.MeasureSpec.makeMeasureSpec(
     View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED), 
     View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
    webView.layout(0, 0, webView.getMeasuredWidth(), 
      webView.getMeasuredHeight()); 
    webView.setDrawingCacheEnabled(true); 
    webView.buildDrawingCache(); 
    Bitmap bm = Bitmap.createBitmap(webView.getMeasuredWidth(), 
      webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 

    Canvas bigcanvas = new Canvas(bm); 
    Paint paint = new Paint(); 
    int iHeight = bm.getHeight(); 
    bigcanvas.drawBitmap(bm, 0, iHeight, paint); 
    webView.draw(bigcanvas); 
    return bm; 
} 

यह बात करने के लिए ठीक काम करता है जब मैं एक बहुत में ज़ूम, जिस स्थिति में मैं OutOfMemory क्रैश मिलता है: मैं इस कोड है, जो मैं here से मिला करते थे। मैंने इसे एक ही तस्वीर के साथ परीक्षण किया (थोड़ा ज़ूम किया गया और अधिकतम तक ज़ूम किया गया) और यह ऊपर वर्णित तरीके से व्यवहार करता है।

मैं शुरू में

while(webView.canZoomOut()){ 
     webView.zoomOut(); 
} 

जोड़कर इस का मुकाबला करने की कोशिश की है, लेकिन यह सब पर मदद नहीं करता है।

+0

त्वरित वैकल्पिक हल आप android जोड़ सकते हैं। –

+2

गंदा कामकाज जो अधिकतर समय काम नहीं करेगा .... यह आपके ओओएम अपवाद – MarkySmarky

+0

में देरी करेगा, यह स्पष्ट है कि आप बहुत बड़े बिटमैप प्राप्त करना चाहते हैं। आपको अपने ऐप में अनंत स्मृति नहीं मिल सकती है। –

उत्तर

0

ठीक है, मैंने इसे स्वयं को तोड़ दिया है। समस्या वास्तव में इस तथ्य में थी कि ज़ूमिंग आउट प्रक्रिया समाप्त होने से पहले फ़ंक्शन Bitmap वाय लौटा, इसलिए मुझे इसे देरी हुई।

मैं

Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       //bulk of my code 
      } 
     }, 1000); 

जो public Bitmap से public void को समारोह की संरचना बदलने के लिए मजबूर शामिल किया। Here's directly related thread। कुछ मामूली बदलाव मैं अभी भी ठीक करने के लिए की जरूरत के बावजूद, दृष्टिकोण एक आकर्षण

+0

तो, आप ज़ूम इन करने से पहले अपने 'वेब व्यू' के मूल आयामों को सीधे क्यों नहीं प्राप्त करते हैं और 'बिटमैप 'के लिए लक्ष्य आयाम के रूप में मूल आयामों का उपयोग करके' बिटमैप.क्रेटस्केल्डबिटमैप() 'का उपयोग करते हैं? –

+0

@ ऑलेक्ज़ेंडर फिर्सोव, क्या आप वाकई हैंडलर का उपयोग कर स्मृति से बाहर नहीं गए हैं। –

+0

@ क्वेशन जोशी नोप ने विभिन्न छवियों और त्रुटियों के साथ इसे कई बार परीक्षण किया। –

-1

त्वरित सुधार की तरह काम करता है: -

सेट एंड्रॉयड: largeHeap = "true" अपनी AndroidManifest.xml फ़ाइल में। अधिक स्मृति के लिए मैनिफ़ेस्ट फ़ाइल में largeHeap = "true": -

<application 
    android:name="yourapplication" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher_rounded" 
    android:label="@string/app_name" 
    android:largeHeap="true" 
    android:roundIcon="@mipmap/ic_launcher_rounded" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

Gud भाग्य :)

+0

इस ध्वज को अक्सर अनदेखा किया जाता है और यहां तक ​​कि बड़े ढेर के मामले में, आपको अभी भी बिटमैप बनाते समय ओओएम प्राप्त करने की संभावना है। – Dimezis

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