development

비트 맵을 위젯에 동적으로 넣을 때 실패한 바인더 트랜잭션

big-blog 2020. 7. 22. 07:36
반응형

비트 맵을 위젯에 동적으로 넣을 때 실패한 바인더 트랜잭션


아무도 바인더 트랜잭션 오류가 발생한 이유를 말해 줄 수 있습니까 ? 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하는 것입니다.

참고 URL : https://stackoverflow.com/questions/3528735/failed-binder-transaction-when-putting-an-bitmap-dynamically-in-a-widget

반응형