我的应用程序中有一个小部件,其中有一个用于显示画布的 ImageView。
如果我查看我的用户崩溃,我会非常频繁地看到该错误(但总是只在少数设备上):
java.lang.RuntimeException: Unable to start receiver my.package.name.WidgetProvider: java.lang.IllegalArgumentException: RemoteViews for widget update exceeds maximum bitmap memory usage (used: 5715000, max: 5529600 /*these arent always the same :)*/ ) The total memory cannot exceed that required to fill the device's screen once.
我的画布具有动态大小,当用户调整大小时它会自动调整大小,并具有指定的纵横比,它的创建方式如下:
Resources r = context.getResources();
SharedPreferences widgets = context.getSharedPreferences("widgets", 0);
//these are stored in onAppWidgetOptionsChanged when user resizes his widget
int w = widgets.getInt(widgetId + "_width", 130);
int h = widgets.getInt(widgetId + "_height", 160);
w = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, w,
r.getDisplayMetrics());
h = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, h,
r.getDisplayMetrics());
float scaleX = (float) w / (float) 13;
float scaleY = (float) h / (float) 16;
float scale = 1.5f * (scaleX < scaleY ? scaleX : scaleY);//i multiplied it with 1.5 because the canvas was very unsharp
w = (int) (13 * scale);
h = (int) (16 * scale);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget);
Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444);
Canvas canvas = new Canvas(bmp);
[...]
remoteViews.setImageViewBitmap(R.id.widget, bmp);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
我猜这是因为画布比小部件大 1.5 倍,否则它非常不清晰。
我能做些什么?
提前致谢。
梅廷羽衣甘蓝