2011-08-01 1 views
9

내 AppWidget에서 RemoteViews를 업데이트 할 때 오류가 발생합니다.많은 위젯 비트 맵을 업데이트 할 때 FAILED BINDER TRANSACTION 오류 방지

.. !!! FAILED BINDER TRANSACTION !!!

이는 RemoteView의 모든 변경 사항이 일련 번호로 (예 : setInt 및 setImageViewBitmap) 발생했기 때문에 발생합니다. 비트 맵은 또한 내부 번들로 직렬화됩니다. 불행히도이 번들은 크기 제한이 매우 작습니다.

사용자가 위젯 용 스킨을 다운로드 할 수 있도록하기 위해 setImageResource를 사용할 수 없습니다.

누구든지이 문제의 해결 방법을 권장 할 수 있습니까? 이미 위젯의 각 인스턴스에 대해 "새로운"RemoteViews 객체를 사용하고 있지만 단일 인스턴스에 너무 많은 업데이트가 포함되어 있습니다.

감사합니다.

답변

10

내가 찾은 가장 좋은 해결 방법은이 방법으로 이미지 크기를 확장하여 해결할 수 있습니다 여기에

remoteViews.setUri(R.id.myImageView, "setImageURI", "file://blahblahblah.png"); 

Android Developers group

8

에서 전체 토론이다 사용 ImageView 객체에 setImageURI를 사용하는 것이 었습니다 :

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를 선택하면 화면에 표시 할 모든 정사각형에 대해 충분히 작을 수 있습니다) 그리고 위젯에 사용하고 문제가 해결 될 것입니다 :)

+0

저를 위해 wokred : Bitmap new_bitmap = scaleDownBitmap (bitmap, 180, context); remoteViews.setImageViewBitmap (R.id.chart_imageView, new_bitmap); – Hubert

0

나는 위와 다른 장소에 나열된 파일 URI를 시도했다. 그것은 효과가 있었지만 두 가지 단점이있었습니다. 먼저 내 앱에서 눈에 띄는 파일을 작성하는 데 500ms가 걸렸습니다. 둘째, ImageView는 밀도()로 이미지를 축소합니다 (Nexus S에서는 1.5).

나를 위해 더 잘 작동하는 솔루션은 이미지를 슬라이스하고 각 슬라이스를 개별적으로 업데이트하는 것입니다.

<LinearLayout orientation=vertical ...> 
    <ImageView id = slice1, ,,,> 
    ... 
    <ImageView id = slice4, ,,,> 
</LinearLayout> 

그런 다음 위젯 제공자에 4 개 조각으로 비트 맵을 절단하고, 리모트 뷰 RemoteViews에 그와 별도로 (각 각 하나를 업데이트하고 자신의 appWidgetManager.updateAppWidget (...)처럼 레이아웃이 보인다. 높은 죄송합니다

1

바인더 트랜잭션 버퍼에는 제한된 고정 크기 (현재 1Mb)가 있으며 프로세스에 대해 진행중인 모든 트랜잭션에서 공유되므로 결과적으로 많은 트랜잭션이있을 때이 예외가 throw 될 수 있습니다. 대부분의 개별 거래가 적당한 크기 인 경우에도 진행됩니다.

이것을 참조하십시오 link

관련 문제