2014-09-12 37 views
0

我在生產中有一個應用程序,並在Galaxy設備上發生大量崩潰。Galaxy設備上的圖像裁剪OutOfMemoryError

堆棧跟蹤:

java.lang.OutOfMemoryError在 android.graphics.Bitmap.nativeCreate(本機方法)在 android.graphics.Bitmap.createBitmap(Bitmap.java:669)在 android.graphics.Bitmap.createBitmap(Bitmap.java:604)at android.graphics.Bitmap.createBitmap(Bitmap.java:530)at com.edmodo.cropper.CropImageView.getCroppedImage(CropImageView.java:357) at com.myapp.app.MyPhotoActivity $ 3.onClick(MyPhotoActivity.java:308) at an droid.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)在 android.os.Looper.loop(Looper.java:137)在 android.app.ActivityThread.main(ActivityThread.java:4960)在 的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 ) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)at dalvik.system.NativeStart.main(Native Method)

設備10種

類型:

銀河S2(GT-I9100T)銀河S2(SGH-T989)的Galaxy Note II(t03g)
銀河注2(t0ltetmo)銀河注2(t0ltespr)銀河S3(d2vmu)
通電M(冬至)銀河S5(kltespr)銀河圖表 (codinaMetroPCS)銀河S3(d2tmo)銀河S3(d2ltetmo)銀河S2 史詩(SPH-D710)銀河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); 
       } 
      }); 

的問題是我沒有任何這些設備與測試 - 任何想法?

回答

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

希望這有助於!

+0

該應用程序是爲Android 4.0.3及以上。任何具體的想法,你可以幫助重新:我的代碼?謝謝。 – canigetabreak 2014-09-12 22:13:36

+0

當你調用creatBitmap時,我看不到mBitmap來自哪裏,所以很難給出任何具體的東西。您正在使用的源位圖是您想要首先關注內存使用情況的地方。 – DSS 2014-09-12 22:28:42

+0

它在這裏,https://github.com/edmodo/cropper/blob/master/cropper/src/com/edmodo/cropper/CropImageView.java你怎麼看? – canigetabreak 2014-09-15 18:30:22