2013-06-18 57 views
7

我这样旋转的位图上,每个按键点击图片旋转90度旋转位图会导致OutOfMemoryException异常

Matrix matrix = new Matrix(); 
matrix.postRotate(90); 
rotated = Bitmap.createBitmap(rotated, 0, 0, 
     rotated.getWidth(), rotated.getHeight(), matrix, true); 
iv.setImageBitmap(rotated); 

我用大量的图片想这一点,但现在一个造成OutOfMemoryError异常。有没有办法来防止这种情况?当然,我可以打电话回收,但后来我失去了位图,必须从imageview中重新获得它。我不认为这会有所作为。

+1

可能会有帮助吗? http://developer.android.com/training/displaying-bitmaps/index.html –

+0

如果旋转ImageView是一种替代方案,那就去吧! – Carnal

+0

旋转ImageView不是一个选项,我保存位图后。尽管在其他情况下,这是一个更好的选择。 –

回答

13

我有建议给你。

1)如果您有任何记忆饥饿任务,请在方法中使用,如果可能,请使用AsyncTask
2)声明对象为WeakReference。这会让你有机会在使用后释放内存。看下面的例子。

public class RotateTask extends AsyncTask<Void, Void, Bitmap> { 
    private WeakReference<ImageView> imgInputView; 
    private WeakReference<Bitmap> rotateBitmap; 

    public RotateTask(ImageView imgInputView){ 
     this.imgInputView = new WeakReference<ImageView>(imgInputView); 
    } 

    @Override 
    protected void onPreExecute() { 
     //if you want to show progress dialog 
    } 

    @Override 
    protected Bitmap doInBackground(Void... params) { 
     Matrix matrix = new Matrix(); 
     matrix.postRotate(90); 
     rotateBitmap = new WeakReference<Bitmap>(Bitmap.createBitmap(rotated, 0, 0,rotated.getWidth(), rotated.getHeight(), matrix, true)); 
     return rotateBitmap.get(); 
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     //dismiss progress dialog 
     imgInputView.get().setImageBitmap(result); 
    } 
} 

此任务的所有视图和对象为WeakReference。完成此任务后,此任务使用的所有内存都是空闲的。尝试这种方法。我用在我的应用程序中。

+1

这是早上4点的救星。 – Ichthyocentaurs

+0

很高兴帮助你.. :) –

0

尝试象下面这样:

Matrix matrix = new Matrix(); 
matrix.postRotate(90); 
rotated = Bitmap.createBitmap(rotated, 0, 0,rotated.getWidth(), rotated.getHeight(), matrix, true); 
ByteArrayOutputStream bmpStream = new ByteArrayOutputStream(); 
rotated.compress(Bitmap.CompressFormat.JPEG,100, bmpStream); 
iv.setImageBitmap(rotated); 
+0

我需要保持PNG格式。不过谢谢。 –

0

如果您只是需要查看图像时,可以设置一个旋转抽拉为shown here

如果你关心的位图的真正的旋转,并且还希望为避免OOM,请检查this link

相关问题