2011-08-01 46 views
9

我對面一個錯誤來當我更新我的RemoteViews在我AppWidget時避免失敗粘結劑事務錯誤。更新大量部件的位圖

.. !!!失敗的粘合劑交易!!!

這是因爲對RemoteView的所有更改都是序列化的(例如setInt和setImageViewBitmap)。位圖也被串行化成內部束。不幸的是,這個捆綁包的尺寸極小。

,因爲我希望能允許用戶下載皮膚的小部件我不能使用setImageResource。

誰能推薦了這個問題的解決方法嗎?我已經爲每個窗口小部件的實例使用了一個「新」RemoteViews對象,但是一個實例包含了太多的更新。

謝謝!

回答

10

我發現最好的解決方法是使用在ImageView對象setImageURI使用

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

這裏是Android Developers group

8

充分討論,您可以通過按比例縮小圖像尺寸這種方式解決它:

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應該在屏幕上),並使用它的小部件,你的問題就解決了:)

+0

這一個對我來說:位圖new_bitmap = scaleDownBitmap(位圖,180,上下文); remoteViews.setImageViewBitmap(R.id.chart_imageView,new_bitmap); – Hubert

0

我嘗試了上述等地上市的文件URI的方式。它工作但有兩個缺點,首先花費500毫秒來編寫在我的應用程序中顯着的文件。其次,ImageView通過密度縮小圖像()(Nexus S爲1.5)。

該工作更好地爲我的解決方案是切片圖像,並分別更新每個切片。佈局看起來像

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

然後在控件提供者切位圖到4片,並用其對RemoteViews單獨(每個更新每一個與它自己的appWidgetManager.updateAppWidget(...)。很抱歉的高但希望你能明白這個想法

1

Binder事務緩衝區有一個有限的固定大小,當前爲1Mb,它被進程中所有正在處理的事務共享,因此當有許多事務處理即使大部分個人交易的尺寸適中,也可以取得進展

參考這link