/ / ऐप क्रैश जब नमूना आकार में बिटमैप विकल्प = 1 - एंड्रॉइड, एंड्रॉइड-कैनवास, एंड्रॉइड-इमेज

ऐप क्रैश जब बिटमैप विकल्प में नमूना आकार = 1 - एंड्रॉइड, एंड्रॉइड-कैनवास, एंड्रॉइड-इमेज

मैं अपने फोन पर ऐप का परीक्षण कर रहा हूं (आकार 720x1280)।जब मैं 2 के नमूना आकार का उपयोग करता हूं तो ऐप ठीक चलता है। जब मैंने 1 के नमूना आकार का उपयोग करने का प्रयास किया तो ऐप उस पंक्ति में क्रैश हो जाता है जहां मैं छवि खींचता हूं (नीचे उल्लिखित कोड)। कृपया मुझे बताएं कि मेरे कोड को कहां सुधार की आवश्यकता है।

            canvas.drawBitmap(backgoundImage, 0, 0  , null);

कोड

    public  Bitmap getAssetImage(Context context, String filename) throws IOException {
AssetManager assets = getApplicationContext().getResources().getAssets();
InputStream buffer = null;
try {
buffer = new BufferedInputStream((assets.open("drawable/" + filename + ".png")));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPurgeable = true;

if (tabletSize) {
Log.i("DragDrop", "am tablet");
} else {
Log.i("DragDrop", "am phone");
options.inSampleSize = 1;
}


Bitmap temp = BitmapFactory.decodeStream(buffer, null, options);
Bitmap finalImage = Bitmap.createScaledBitmap(temp, (int) dWidth, (int) dHeight, true);
temp.recycle();
temp=null;
return finalImage;

}

LogCat

07-07 12:28:14.150: E/AndroidRuntime(7256): FATAL EXCEPTION: Thread-748
07-07 12:28:14.150: E/AndroidRuntime(7256): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@416ec9f0
07-07 12:28:14.150: E/AndroidRuntime(7256): at android.graphics.Canvas.throwIfRecycled(Canvas.java:1026)
07-07 12:28:14.150: E/AndroidRuntime(7256): at android.graphics.Canvas.drawBitmap(Canvas.java:1065)
07-07 12:28:14.150: E/AndroidRuntime(7256): at com.example.funandlearn.DragDrop$MyBringBackSurface.run(DragDrop.java:640)
07-07 12:28:14.150: E/AndroidRuntime(7256): at java.lang.Thread.run(Thread.java:856)

आपके संदर्भ के लिए लाइन # 640 में कोड है

            canvas.drawBitmap(backgoundImage, 0, 0  , null);

उत्तर:

उत्तर № 1 के लिए 1

आपके पास यह है

    Bitmap temp = BitmapFactory.decodeStream(buffer, null, options);
Bitmap finalImage = Bitmap.createScaledBitmap(temp, (int) dWidth, (int) dHeight, true);
temp.recycle();
temp=null;

आपका लॉगकैट कहता है

    Canvas: trying to use a recycled bitmap

उपयोग में न होने पर आपको बिटमैप को रीसायकल करना चाहिए।

डॉक्स . से उद्धरण

एंड्रॉइड 2.3.3 (एपीआई स्तर 10) और उससे कम पर, रीसायकल () का उपयोग करने की सिफारिश की जाती है।

आपको उपयोग करना चाहिए recycle() केवल तभी जब आप सुनिश्चित हों कि बिटमैप का अब उपयोग नहीं किया जा रहा है। यदि आप रीसायकल () को कॉल करते हैं और बाद में बिटमैप बनाने का प्रयास करते हैं, तो आपको त्रुटि मिलेगी: "कैनवास: एक पुनर्नवीनीकरण बिटमैप का उपयोग करने का प्रयास"।

Android 3.0 और उच्चतर पर मेमोरी प्रबंधित करें

एंड्रॉइड 3.0 (एपीआई लेवल 11) पेश करता है बिटमैपFactory.Options.inबिटमैप खेत। यदि यह विकल्प सेट है, तो विकल्प ऑब्जेक्ट लेने वाली डिकोड विधियाँ सामग्री लोड करते समय मौजूदा बिटमैप का पुन: उपयोग करने का प्रयास करेंगी। उपयोग करने की आवश्यकता नहीं है recycle.

इसकी भी जांच करें

http://developer.android.com/training/displaying-bitmaps/manage-memory.html