Galaxy设备上的图像裁剪OutOfMemoryError

时间:2014-09-12 21:45:41

标签: java android bitmap

我有一个正在制作的应用程序,并且在Galaxy设备上遇到了很多崩溃。

堆栈跟踪:

  

java.lang.OutOfMemoryError at   android.graphics.Bitmap.nativeCreate(Native Method)at   android.graphics.Bitmap.createBitmap(Bitmap.java:669)at   android.graphics.Bitmap.createBitmap(Bitmap.java:604)at   android.graphics.Bitmap.createBitmap(Bitmap.java:530)at   com.edmodo.cropper.CropImageView.getCroppedImage(CropImageView.java:357)   在com.myapp.app.MyPhotoActivity $ 3.onClick(MyPhotoActivity.java:308)   在android.view.View.performClick(View.java:4191)at   android.view.View $ PerformClick.run(View.java:17229)at   android.os.Handler.handleCallback(Handler.java:615)at   android.os.Handler.dispatchMessage(Handler.java:92)at   android.os.Looper.loop(Looper.java:137)at   android.app.ActivityThread.main(ActivityThread.java:4960)at   java.lang.reflect.Method.invokeNative(Native Method)at   java.lang.reflect.Method.invoke(Method.java:511)at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1038)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)at   dalvik.system.NativeStart.main(原生方法)

设备类型:

  

Galaxy S2(GT-I9100T)Galaxy S2(SGH-T989)Galaxy Note II(t03g)
  Galaxy Note2(t0ltetmo)Galaxy Note2(t0ltespr)Galaxy S3(d2vmu)
  Electrify M(至日)Galaxy S5(kltespr)Galaxy Exhibit   (codinaMetroPCS)Galaxy S3(d2tmo)Galaxy S3(d2ltetmo)Galaxy S2   史诗(SPH-D710)Galaxy Win(delos3geur)

CropImageView

 // Crop the subset from the original Bitmap. (line 357 below)
        final Bitmap croppedBitmap = Bitmap.createBitmap(mBitmap,
                                                         (int) actualCropX,
                                                         (int) actualCropY,
                                                         (int) actualCropWidth,
                                                         (int) actualCropHeight);

        return croppedBitmap;
    }

MyPhotoActivity

usePhotoButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
// line 308 below
                    finalResizedBitmap = getResizedBitmap(mImageView.getCroppedImage(), PHOTO_RESIZE_VALUE, PHOTO_RESIZE_VALUE);
                    topCropView.setVisibility(View.GONE);
                    topFinalView.setVisibility(View.VISIBLE);
                    mFinalImageView.setImageBitmap(finalResizedBitmap);
                    usePhotoButton.setVisibility(View.GONE);
                    uploadPhotoButton.setEnabled(true);
                    uploadPhotoButton.setVisibility(View.VISIBLE);
                }
            });

问题是我没有任何这些设备可以测试 - 任何想法??

1 个答案:

答案 0 :(得分:0)

分配给您的应用程序的内存堆因设备而异,这就是您根据设备看到可变性的原因。某些设备上可能只有16MB的RAM。您可以谷歌查找有问题的设备上的堆大小。

http://developer.android.com/training/articles/memory.html

在Android 3.0之前,位图分配是在“本机”堆中完成的,因此您也会看到一些可变性。对于使用本机堆进行位图分配的设备,我总是发现本机堆的大小与VM堆大小相同。

https://developer.android.com/training/displaying-bitmaps/manage-memory.html

您需要使用BitmapOptions和适当的缩放来降低内存使用量。

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

该文章中的例子非常好,所以我不再重复如何使用它们的例子。

如果您认为有必要,可以监控堆使用情况,以避免进行导致OOM的分配。

How do I detect the heap size usage of an android application

希望这有帮助!