我在向gridview添加变量背景时得到OutOfMemoryError
...
在
final Bitmap shelfBackground = BitmapFactory.decodeResource(resources, background);
这是我的代码。
public class ShelvesView extends GridView {
private Bitmap mShelfBackground;
private int mShelfWidth;
private int mShelfHeight;
public ShelvesView(Context context) {
super(context);
}
public ShelvesView(Context context, AttributeSet attrs) {
super(context, attrs);
load(context, attrs, 0);
}
public ShelvesView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
load(context, attrs, defStyle);
}
private void load(Context context, AttributeSet attrs, int defStyle) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ShelvesView, defStyle, 0);
int imageWidth = options.outWidth;
final Resources resources = getResources();
final int background = a.getResourceId(R.styleable.ShelvesView_shelfBackground, 0);
final Bitmap shelfBackground = BitmapFactory.decodeResource(resources, background);
if (shelfBackground != null) {
mShelfWidth = shelfBackground.getWidth();
mShelfHeight = shelfBackground.getHeight();
mShelfBackground = shelfBackground;
}
a.recycle();
}
@Override
protected void dispatchDraw(Canvas canvas) {
final int count = getChildCount();
final int top = count > 0 ? getChildAt(0).getTop() : 0;
final int shelfWidth = mShelfWidth;
final int shelfHeight = mShelfHeight;
final int width = getWidth();
final int height = getHeight();
int bottom = (count > 0) ? getChildAt(count - 5).getBottom() + shelfHeight : 0;
final Bitmap background = mShelfBackground;
for (int x = 0; x < width; x += shelfWidth) {
for (int y = top; y < height; y += shelfHeight) {
canvas.drawBitmap(background, x, y, null);
}
}
//drawDecorations(canvas, top, shelfHeight, width);
// canvas.drawBitmap(mShelfLeftLayer,0,bottom, null);
super.dispatchDraw(canvas);
}
}
答案 0 :(得分:4)
向其添加位图选项 -
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
shelfBackground = BitmapFactory.decodeResource(resources, background, options);
答案 1 :(得分:2)
使用Android SDK中的示例处理UI线程中的图像:
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
private int data = 0;
public BitmapWorkerTask(ImageView imageView) {
// Use a WeakReference to ensure the ImageView can be garbage collected
imageViewReference = new WeakReference<ImageView>(imageView);
}
// Decode image in background.
@Override
protected Bitmap doInBackground(Integer... params) {
data = params[0];
return decodeSampledBitmapFromResource(getResources(), data, 100, 100));
}
// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
您可以在此处找到更多使用sampleSize
decodeResource进行解码的示例。
答案 2 :(得分:1)
您可以使用BitmapFactory.Options类将图像裁剪为任意大小。
您可以使用以下内容:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inSampleSize = 8; // 1/8th of actual image.
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
有关详细信息,请参阅this。
此处,当您使用Bitmap
时,请始终调用其bmp.recycle()
方法,因为GC
无法清除Bitmap
所占用的内存,如果您的位图不是收集垃圾,然后你得到OME
。
此外,我已经提供了通用解决方案,请参阅this。