비트 맵을 위젯에 동적으로 넣을 때 실패한 바인더 트랜잭션
아무도 바인더 트랜잭션 오류가 발생한 이유를 말해 줄 수 있습니까 ? 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)를 가지며 프로세스에 대해 진행중인 모든 트랜잭션이 공유합니다. 따라서 대부분의 개별 트랜잭션이 중간 규모 인 경우에도 진행중인 트랜잭션이 많은 경우이 예외가 발생할 수 있습니다.
이 링크를 참조하십시오
이 글 에서 나의 대답을보십시오 .
intent.putExtra("Some string",very_large_obj_for_binder_buffer);
한 활동에서 다른 활동으로 큰 요소를 전송하여 바인더 트랜잭션 버퍼를 초과했습니다.
내부 저장소에 이미지를 저장 한 다음 .setBitmap () 대신 .setImageURI ()를 사용하여이 문제를 해결했습니다.
올바른 접근 방식은 알림을 업데이트 할 때마다 setImageViewUri()
(느리게) setImageViewBitmap()
또는를 다시 작성 RemoteView
하는 것입니다.
'development' 카테고리의 다른 글
푸시 알림 권한이 없습니다. (0) | 2020.07.22 |
---|---|
svn : 특정 버전의 트렁크에서 분기를 만드는 방법 (0) | 2020.07.22 |
Cython : "치명적인 오류 : numpy / arrayobject.h : 해당 파일 또는 디렉토리가 없습니다" (0) | 2020.07.22 |
Visual Studio 2013이 웹 응용 프로그램으로 변환되지 않음 (0) | 2020.07.22 |
SQL Server 버전을 확인하는 방법 (0) | 2020.07.22 |