在旋转位图时获取OME

时间:2012-05-18 11:22:19

标签: android

我试图通过以下代码旋转Img(位图)。在得到OME之后,它的工作时间可以达到5-6转?

private void rotateImg() {
    Matrix matrix = new Matrix();
    matrix.postScale(curScale, curScale);
    matrix.postRotate(curRotate);
    try {
        temp = Bitmap.createBitmap(temp, 0, 0, temp.getWidth(),
                temp.getHeight(), matrix, true);
        setImage.setImageBitmap(temp);
    } catch (OutOfMemoryError e) {
        curRotate = curRotate - 45.0f;
        Toast.makeText( this,"Out Of Memory",Toast.LENGTH_LONG).show();
    }
}

这里“test”是从SDCard加载的静态位图文件。

3 个答案:

答案 0 :(得分:1)

第一个答案可能是一个潜在的解决方案。这里的问题是你正在创建很多的Bitmap对象,这些对象相当大,而且无论出于何种原因他们都没有获得gc'd。

更好的解决方案可能是使用单个位图,并在绘制时应用旋转/缩放。例如,如果您使用的CanvasView的一部分,则rotateImg可以简单地旋转矩阵并在视图上调用invalidate,然后在视图中onDraw您可以使用画布上的void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint)来渲染位图。文档为here

答案 1 :(得分:1)

为什么每次都创建位图?有什么具体原因吗? 如果不使用以下代码:

private void rotateImg() {
    int cx = temp.getWidth() / 2;
    int cy = temp.getHeight() / 2;
    matrix.preTranslate(-cx, -cy);
    matrix.postRotate(curRotate);
    matrix.postTranslate(cx, cy);
    setImage.setImageMatrix(matrix);
}

答案 2 :(得分:0)

每次调用此方法时,可能必须使用bitmap.recycle()方法。试试这样的事情,

private void rotateImg() {
    Matrix matrix = new Matrix();
    matrix.postScale(curScale, curScale);
    matrix.postRotate(curRotate);
    try {
         temp.recycle();  //removes the memory occupied by this bitmap object
          temp=null;
        temp = Bitmap.createBitmap(temp, 0, 0, temp.getWidth(),
                temp.getHeight(), matrix, true);
        setImage.setImageBitmap(temp);
    } catch (OutOfMemoryError e) {
        curRotate = curRotate - 45.0f;
        Toast.makeText( this,"Out Of Memory",Toast.LENGTH_LONG).show();
    }
}