2012-09-26 15 views
4

我得到OutOfMemoryError,而我加入可變背景的GridView ... 在java.lang.OutOfMemoryError在android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:374)

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); 
    } 

} 

回答

4

添加位圖選擇它 -

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 8; 
shelfBackground = BitmapFactory.decodeResource(resources, background, options); 
+0

我試過那個。但是我在「canvas.drawBitmap(background,x,y,null)」出現錯誤;「 – indraja

+0

您可以發佈您收到的錯誤消息嗎? – Pie

+0

我得到以下錯誤日誌..和 (ShelvesView.java:72)是「canvas.drawBitmap(background,x,y,null);」在dispatchDraw方法 E/AndroidRuntime(6296):顯示java.lang.NullPointerException E/AndroidRuntime(6296):\t在android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:692) E/AndroidRuntime(6296):\t在android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:103) E/AndroidRuntime(6296):\t at com.example.home.ShelvesView.dispatchDraw(ShelvesView.java:72) – indraja

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); 
     } 
    } 
} 

}

在這裏你可以找到更多使用sampleSizedecodeResource解碼的示例。

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

相關問題