ใครช่วยบอกสาเหตุของข้อผิดพลาดในการทำธุรกรรม Binder ที่ล้มเหลวได้ไหม ฉันเห็นข้อความแสดงข้อผิดพลาดนี้ใน logcat ฉันได้รับข้อผิดพลาดนี้ขณะพยายามใส่บิตแมปแบบไดนามิกในวิดเจ็ต ...
ใครช่วยบอกสาเหตุของข้อผิดพลาดในการทำธุรกรรม Binder ที่ล้มเหลวได้ไหม ฉันเห็นข้อความแสดงข้อผิดพลาดนี้ใน logcat ฉันได้รับข้อผิดพลาดนี้ขณะพยายามใส่บิตแมปแบบไดนามิกในวิดเจ็ต ...
คำตอบ:
สิ่งนี้เกิดขึ้นเนื่องจากการเปลี่ยนแปลงทั้งหมดใน RemoteViews เป็นแบบอนุกรม (เช่น setInt และ setImageViewBitmap) บิตแมปยังถูกทำให้เป็นอนุกรมในบันเดิลภายใน ขออภัยกลุ่มนี้มีขีด จำกัด ขนาดที่เล็กมาก
คุณสามารถแก้ไขได้โดยการลดขนาดรูปภาพด้วยวิธีนี้:
public static Bitmap scaleDownBitmap(Bitmap photo, int newHeight, Context context) {
final float densityMultiplier = context.getResources().getDisplayMetrics().density;
int h= (int) (newHeight*densityMultiplier);
int w= (int) (h * photo.getWidth()/((double) photo.getHeight()));
photo=Bitmap.createScaledBitmap(photo, w, h, true);
return photo;
}
เลือก newHeight ให้เล็กพอ (~ 100 สำหรับทุก ๆ ตารางที่ควรจะอยู่บนหน้าจอ) และใช้สำหรับวิดเจ็ตของคุณแล้วปัญหาของคุณจะได้รับการแก้ไข :)
คุณสามารถบีบอัดบิตแมปเป็นอาร์เรย์ของไบต์จากนั้นคลายการบีบอัดในกิจกรรมอื่นเช่นนี้
บีบอัด !!
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] bytes = stream.toByteArray();
setresult.putExtra("BMP",bytes);
ยกเลิกการบีบอัด !!
byte[] bytes = data.getByteArrayExtra("BMP");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
บัฟเฟอร์ธุรกรรม Binder มีขนาดคงที่ จำกัด ปัจจุบันคือ 1Mb ซึ่งใช้ร่วมกันโดยธุรกรรมทั้งหมดที่อยู่ระหว่างดำเนินการสำหรับกระบวนการ ดังนั้นข้อยกเว้นนี้สามารถเกิดขึ้นได้เมื่อมีธุรกรรมจำนวนมากอยู่ระหว่างดำเนินการแม้ว่าธุรกรรมส่วนใหญ่จะมีขนาดปานกลางก็ตาม
อ้างอิงลิงค์นี้
ฉันได้แก้ไขปัญหานี้โดยการจัดเก็บภาพในที่จัดเก็บข้อมูลภายในแล้วใช้. setImageURI () แทนที่จะเป็น. setBitmap ()
แนวทางที่ถูกต้องคือใช้setImageViewUri()
(ช้าลง) หรือsetImageViewBitmap()
และสร้างใหม่RemoteView
ทุกครั้งที่คุณอัปเดตการแจ้งเตือน