2011-08-01 8 views
9

私のAppWidgetでRemoteViewを更新しているときにエラーが表示されます。多くのウィジェットビットマップを更新すると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);リモートビュー.setImageViewBitmap(R.id.chart_imageView、new_bitmap); – Hubert

0

私は上記のファイルURIのアプローチと他の場所を試しました。それは働いたが、2つの欠点があった、私のアプリで目立つファイルを書き込むために500msかかった。次に、ImageViewは密度()(Nexus Sの1.5)で画像を縮小します。

私にとってより効果的だった解決策は、イメージをスライスし、各スライスを個別に更新することでした。レイアウトはウィジェットプロバイダーで次に

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

のように見えるそのRemoteViews、独自appWidgetManager.updateAppWidget(...)上の各(4つのスライスにビットマップを切断し、それぞれを個別に更新します。高申し訳ありません

1

バインダートランザクションバッファのサイズは限られています(現在は1Mbです)。これは、処理中のすべてのトランザクションで共有されます。このため、この例外は、トランザクションが多数ある場合にスローされます。個々の取引の大部分が中程度のサイズのものであっても進歩する。

これを参照してくださいlink

関連する問題