调用getDrawable()时java.lang.OutOfMemoryError

时间:2017-11-14 11:08:30

标签: java android out-of-memory android-drawable

我得到以下内存不足错误,我不确定原因。

Failed to allocate a 1860508 byte allocation with 905740 free bytes and 884KB until OOM

java.lang.OutOfMemoryError: Failed to allocate a 1860508 byte allocation with 905740 free bytes and 884KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method) 
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:837)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:656) 
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1037) 

at android.content.res.Resources.loadDrawableForCookie(Resources.java:4056) 
at android.content.res.Resources.loadDrawable(Resources.java:3929) 
at android.content.res.Resources.getDrawable(Resources.java:1991) 
at android.content.res.Resources.getDrawable(Resources.java:1973) 
at android.graphics.drawable.LevelListDrawable.inflate(LevelListDrawable.java:128) 
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1192) 
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1086) 
at android.content.res.Resources.loadDrawableForCookie(Resources.java:4045) 
at android.content.res.Resources.loadDrawable(Resources.java:3929) 
at android.content.res.Resources.getDrawable(Resources.java:1991) 
at android.content.res.Resources.getDrawable(Resources.java:1973) 
at android.content.Context.getDrawable(Context.java:409)
at com.MyCompany.MyApp.Login.updateWifiStatus(Login.java:942)
at com.MyCompany.MyApp.Login$6.run(Login.java:576) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:6939) 
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

我正在使用5级资源来指示wifi状态,这是我正在使用的代码

    WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

    // Level of current connection
    int rssi = wifiManager.getConnectionInfo().getRssi();
    int level = WifiManager.calculateSignalLevel(rssi, 5);
    Drawable db = getDrawable(R.drawable.stat_sys_wifi_signal);
    db.setLevel(level);
    wifiMenu.setIcon(db);

图像大小相同(512x512)。

在参考其他答案时,我的清单中有很大的答案。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

Use TinyPNG

  

TinyPNG使用智能有损压缩技术来减少文件   PNG文件的大小。通过选择性地减少颜色数量   在图像中,存储数据所需的字节更少。效果   几乎看不见但它在文件大小上有很大差异!

使用此链接压缩所有图像。

在Android应用程序中使用前缩小所有图片的大小。

请务必阅读@mudit_sen提供的文件Loading Large Bitmaps Efficiently

希望这可以帮助你。