1

我的应用程序中有一个小部件,其中有一个用于显示画布的 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 倍,否则它非常不清晰。

我能做些什么?

提前致谢。

梅廷羽衣甘蓝

4

1 回答 1

1

文档指定:

RemoteViews 对象使用的总 Bitmap 内存不能超过填充屏幕 1.5 倍所需的内存,即。(屏幕宽度 x 屏幕高度 x 4 x 1.5)字节。

因此,使用它来控制您的位图大小,然后在布局中使用 ImageView scaleType fitCenter 来缩放以适应小部件中的位图。

于 2013-10-26T05:29:32.690 回答