아무도 바인더 트랜잭션 실패 의 이유를 말해 줄 수 있습니까 ? logcat에서이 오류 메시지를 볼 수 있습니다. 위젯에 동적으로 비트 맵을 넣으려고 할 때이 오류가 발생합니다.
답변
이는 RemoteView에 대한 모든 변경 사항이 직렬화되어 있기 때문입니다 (예 : 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);
답변
바인더 트랜잭션 버퍼는 현재 1Mb의 제한된 고정 크기를 가지며 프로세스를 위해 진행중인 모든 트랜잭션에서 공유됩니다. 따라서 대부분의 개별 트랜잭션이 중간 크기 인 경우에도 진행중인 트랜잭션이 많으면이 예외가 throw 될 수 있습니다.
이 링크를 참조하십시오
답변
이
스레드 에서 내 대답을 참조하십시오 .
intent.putExtra("Some string",very_large_obj_for_binder_buffer);
한 활동에서 다른 활동으로 큰 요소를 전송하여 바인더 트랜잭션 버퍼를 초과하고 있습니다.
답변
내부 저장소에 이미지를 저장 한 다음 .setBitmap () 대신 .setImageURI ()를 사용하여이 문제를 해결했습니다.
답변
올바른 접근 방식은 알림을 업데이트 할 때마다 를 사용 setImageViewUri()
(느리게)하거나 setImageViewBitmap()
를 다시 RemoteView
만드는 것입니다.