Giao dịch liên kết không thành công khi đặt bitmap động vào tiện ích con


116

Ai có thể cho tôi biết lý do của lỗi giao dịch liên kết không thành công không ? Tôi có thể thấy thông báo lỗi này trong logcat. Tôi gặp phải lỗi này khi cố gắng đặt động bitmap vào một tiện ích ...

Câu trả lời:


91

Điều này là do tất cả các thay đổi đối với RemoteViews được tuần tự hóa (ví dụ: setInt và setImageViewBitmap). Các bitmap cũng được tuần tự hóa thành một gói bên trong. Thật không may, gói này có giới hạn kích thước rất nhỏ.

Bạn có thể giải quyết nó bằng cách thu nhỏ kích thước hình ảnh theo cách này:

 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;
 }

Chọn newHeight đủ nhỏ (~ 100 cho mỗi hình vuông mà nó sẽ chiếm trên màn hình) và sử dụng nó cho widget của bạn, và vấn đề của bạn sẽ được giải quyết :)


1
Điều tôi không hiểu chính xác là những gì xảy ra ở đây. Tôi đang sử dụng ViewPager với một tập dữ liệu khá lớn, nhưng nó vẫn nhớ mọi thứ giữa các trang bất chấp spam lỗi liên kết. Gói có được ghi vào bộ nhớ cục bộ rồi tìm nạp trước hay không? Tôi có thể mất dữ liệu nếu tôi thêm nhiều trang không?
G_V

7
Nhưng điều này sẽ làm giảm chất lượng hình ảnh
John Joe

64

Bạn có thể nén bitmap dưới dạng một mảng của byte và sau đó giải nén nó trong một hoạt động khác, như thế này.

Nén !!

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] bytes = stream.toByteArray(); 
        setresult.putExtra("BMP",bytes);

Giải nén!!

        byte[] bytes = data.getByteArrayExtra("BMP");
        Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

1
Hoàn hảo, điều này làm giảm đáng kể kích thước bitmap.
Navin

1
tại sao không sử dụng JPEG thay vì PNG? không phải nó được nén tốt hơn?
mehmet6parmak

3
@ mehmet6parmak PNG được sử dụng vì nó không mất dữ liệu, không giống như JPEG. Đúng, JPEG nén tốt hơn, nhưng kết quả là chất lượng (phần nào) bị ảnh hưởng.
Petzku

không hoạt động với tôi :( stackoverflow.com/questions/34540819/…
John Joe,

Thanh danh! Giải pháp tuyệt vời cho một triển khai tạm thời mà tôi đang làm việc. Mặc dù nên tránh truyền dữ liệu nặng khi sử dụng Gói / Ý định.
sud007 28/07/17

37

Bộ đệm giao dịch Binder có kích thước cố định hạn chế, hiện tại là 1Mb, được chia sẻ bởi tất cả các giao dịch đang diễn ra trong quy trình. Do đó, ngoại lệ này có thể bị loại bỏ khi có nhiều giao dịch đang diễn ra ngay cả khi hầu hết các giao dịch riêng lẻ có quy mô vừa phải.

tham khảo liên kết này


12

Xem câu trả lời của tôi trong chủ đề này .

intent.putExtra("Some string",very_large_obj_for_binder_buffer);

Bạn đang vượt quá bộ đệm giao dịch liên kết bằng cách chuyển (các) phần tử lớn từ hoạt động này sang hoạt động khác.


Tôi đã gặp vấn đề tương tự, tôi chỉ cần loại bỏ vấn đề putExtra đã sắp xếp!
Ngà

8

Tôi đã giải quyết vấn đề này bằng cách lưu trữ hình ảnh trên bộ nhớ trong và sau đó sử dụng .setImageURI () thay vì .setBitmap ().


1
và không vượt qua hình ảnh thông qua Parcelable từ màn hình để màn hình hoặc lâu hơn, tôi đoán đó là tồi tệ nhất trong trường hợp này
MartinC

3

Cách tiếp cận đúng là sử dụng setImageViewUri()(chậm hơn) hoặc setImageViewBitmap()và tạo lại RemoteViewmỗi khi bạn cập nhật thông báo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.