2017-08-29 81 views
0

我試圖加載JPEG照片與我的Android手機上大小965KB的。代碼如下。當我運行代碼時,應用程序崩潰。爲什麼android要求爲小照片分配大量內存?

Button _btn = (Button) findViewById(R.id.btn1); 
_btn.setOnClickListener(new View.OnClickListener() { 

    @Override 
     public void onClick(View view) { 
      Drawable _draw = getResources().getDrawable(R.drawable.sea, null); 
    } 
}); 

這是崩潰日誌。

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.a3sumatch.multipart, PID: 29240 java.lang.OutOfMemoryError: Failed to allocate a 362797068 byte allocation with 8388608 free bytes and 254MB until OOM at dalvik.system.VMRuntime.newNonMovableArray(Native Method) at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1080) at android.content.res.Resources.loadDrawableForCookie(Resources.java:2761) at android.content.res.Resources.loadDrawable(Resources.java:2654) at android.content.res.Resources.getDrawable(Resources.java:833) at com.a3sumatch.multipart.MainActivity$1.onClick(MainActivity.java:40) at android.view.View.performClick(View.java:5205) at android.view.View$PerformClick.run(View.java:21176) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:171) at android.app.ActivityThread.main(ActivityThread.java:5611) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)

+1

[Android:java.lang.OutOfMemoryError:無法分配23970828字節分配和2097152空閒字節S和2MB直到OOM(https://stackoverflow.com/questions/32244851/androidjava-lang-outofmemoryerror-failed-to-allocate-a-23970828-byte-allocatio) – petey

+0

你知道先說:喜歡Android的規模圖像取決於屏幕分辨率?所以它可能比原來大得多。第二位圖是一種未壓縮格式,並擁有每像素一個int,而JPEG幾乎不會被壓縮 –

回答

2

I am trying to load a jpeg photo with a size of 965KB on my android phone

這絕對是一個巨大的照片。 JPEG,如PNG和WebP,是一種壓縮文件格式。從這個角度來看,我的禿頭的3229x2480照片是829.3KB的JPEG格式。我希望你的每個維度都會更大一些。該分辨率高於我所瞭解的任何Android設備屏幕的分辨率。

OutOfMemoryError爲362797068字節分配。 A Bitmap是圖像的未壓縮版本。 362797068字節相當於大約9524x9524方形圖像(和4字節/像素)。

所以,你需要做兩件事情:

  1. 如果你有res/drawable/這一形象,將其移動到res/drawable-nodpi/

  2. 至少四個因素減少該圖像的分辨率沿着每個維度

+0

對不起,我還是不明白。爲什麼Android會嘗試爲不超過1M的照片分配大約345M的內存? –

+1

@StoneLai:首先,引用我的回答,「JPEG,PNG一樣和WebP的,是一個壓縮文件格式...一個'Bitmap'是圖像的壓縮版本。」壓縮文件很容易只是未壓縮數據大小的1-10%。其次,如果你把圖像中'你設計你的形象爲'-mdpi'顯示器和Android的RES /繪製/'我懷疑,你告訴的Android應該在高檔圖像高密度屏幕。 – CommonsWare

+0

我把圖像放在drawable-xhdpi下,它工作。謝謝!!!!!!! –

相關問題