البرمجة

تجنب خطأ Can’t compress a recycled bitmap

عندما تواجه رسالة الخطأ “java.lang.IllegalStateException: Can’t compress a recycled bitmap”، يشير ذلك إلى محاولة ضغط Bitmap تم تدويرها مسبقًا. في الكود الذي قدمته، يتم استدعاء دالة recycle() على الBitmap mIcon11 قبل محاولة ضغطها. عندما يتم استدعاء recycle()، يتم تحرير الموارد التي تم استخدامها بواسطة Bitmap، وبالتالي، يصبح الBitmap غير صالح للاستخدام.

الحل لهذه المشكلة يكمن في تأجيل استدعاء دالة recycle() حتى بعد الانتهاء من استخدام الBitmap. في الكود الحالي، تم استدعاء recycle() مباشرة بعد استخدام الBitmap في إنشاء الصورة البيضاوية وقبل محاولة ضغطها وحفظها. لحل هذه المشكلة، يجب نقل استدعاء recycle() بعد انتهاء عمليات الضغط والحفظ.

بالتالي، يمكن تعديل الكود كما يلي:

java
String foto = UT_drive_dropbox.AM.getfoto(); Bitmap mIcon11 = null; try { InputStream in = new java.net.URL(foto).openStream(); mIcon11 = BitmapFactory.decodeStream(in); } catch (Exception e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } final Bitmap output = Bitmap.createBitmap(mIcon11.getWidth(), mIcon11.getHeight(), Bitmap.Config.ARGB_8888); final Canvas canvas = new Canvas(output); final int color = Color.RED; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, mIcon11.getWidth(), mIcon11.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawOval(rectF, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(mIcon11, rect, rect, paint); String fileName = "avatar.jpg"; ByteArrayOutputStream bytes = new ByteArrayOutputStream(); mIcon11.compress(Bitmap.CompressFormat.JPEG, 40, bytes); File sd = new File(Environment.getExternalStorageDirectory(), getString(R.string.app_name) + File.separator + fileName); FileOutputStream fileOutputStream = null; try { sd.createNewFile(); fileOutputStream = new FileOutputStream(sd); fileOutputStream.write(bytes.toByteArray()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } // تأجيل استدعاء recycle() حتى بعد الانتهاء من استخدام الBitmap mIcon11.recycle();

مع هذا التغيير، يجب أن يعمل الكود بشكل صحيح دون رمي IllegalStateException. تأكد دائمًا من عدم استدعاء recycle() قبل الانتهاء من استخدام الBitmap لتجنب هذا النوع من الأخطاء.

المزيد من المعلومات

بالطبع، دعوني أكمل المقال بتوسيع المحتوى لتوضيح بعض النقاط الإضافية.

عندما يتم التعامل مع الصور في تطبيقات Android، يُعَدُّ ضغط الصور وحفظها في ذاكرة التخزين الخارجية أمرًا شائعًا. يساعد هذا في توفير مساحة تخزين وتقليل حجم الصورة، مما يسهل عملية نقلها ومشاركتها. ومع ذلك، من المهم فهم كيفية التعامل السليم مع كائنات Bitmap في Android لتجنب الأخطاء مثل “Can’t compress a recycled bitmap”.

ال Bitmap في Android هي عبارة عن مصفوفة من البكسلات تمثل صورة. عندما تتم إنشاء Bitmap، تحتاج Android إلى تخصيص ذاكرة لتخزين هذه البكسلات. عندما لا تكون الBitmap أكثر ضرورة، يمكن تحرير هذه الذاكرة لاستخدامها في الأغراض الأخرى، وذلك باستدعاء الدالة recycle(). ومع ذلك، عندما تكون Bitmap قد تم تدويرها (recycled)، لا يمكن استخدامها مرة أخرى. وهنا يأتي الخطأ “Can’t compress a recycled bitmap” الذي يشير إلى محاولة ضغط Bitmap تم تدويرها بالفعل.

لتجنب هذا الخطأ، يجب التأكد من عدم استدعاء recycle() على الBitmap قبل الانتهاء من استخدامها بالكامل. في الكود الذي قمت بتقديمه، تم استدعاء recycle() بعد استخدام الBitmap في إنشاء صورة بيضاوية وقبل محاولة ضغطها وحفظها، مما أدى إلى حدوث الخطأ. لحل هذه المشكلة، يجب تأجيل استدعاء recycle() حتى بعد الانتهاء من استخدام الBitmap بالكامل.

من الجيد أيضًا الانتباه إلى أنه يمكن استخدام طرق مختلفة لضغط الصور في Android، مثل تقليل جودة الصورة أو تغيير حجمها. قد تحتاج إلى تحديد أي الطرق مناسبة لاحتياجات تطبيقك المحددة، مع مراعاة جودة الصورة المطلوبة واحتياجات المساحة في التخزين.

باستخدام الأسلوب السليم للتعامل مع Bitmaps في Android، يمكنك ضمان تجنب الأخطاء مثل “Can’t compress a recycled bitmap”، وبالتالي، تحسين أداء تطبيقك وموثوقيته.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر