我有关于从资源加载Bitmap的问题.我的代码:
public voID onClick(VIEw vIEw) { if (mainbutton == vIEw) { Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.test); }}
test.jpg图像分辨率为3288 x 4936px.它是jpeg(未压缩时为3,9MB / 48,7MB).虽然此功能有效(在我的Nexus 7 2013设备上),但会发生以下异常:
java.lang.OutOfMemoryError: Failed to allocate a 259673100 byte allocation with 5222644 free bytes and 184MB 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.BitmapFactory.decodeResource(BitmapFactory.java:467) at androID.graphics.BitmapFactory.decodeResource(BitmapFactory.java:497) at pl.jaskol.androIDtest.MainActivity.onClick(MainActivity.java:50) at androID.vIEw.VIEw.performClick(VIEw.java:4756) at androID.vIEw.VIEw$PerformClick.run(VIEw.java:19749) at androID.os.Handler.handleCallback(Handler.java:739) at androID.os.Handler.dispatchMessage(Handler.java:95) at androID.os.Looper.loop(Looper.java:135) at androID.app.ActivityThread.main(ActivityThread.java:5221) 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:899) at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:694)
为什么应用程序尝试分配多达248MB?
我在Qt for AndroID中编写了类似的应用程序,在资源中使用相同的图像并且工作正常.
编辑:
>我无法调整大小.
>这是一个非常简单的应用程序,比如hello world.它没有别的,只是从资源加载位图.
EDIT2:
吉姆的解决方案适合我.但还有另一个问题.在位图加载后,它是4倍太大(2倍高度和2倍宽度).我尝试了各种图像,包括在Pinta或Gimp中创建的新图像.
解决方法:
您可以在AndroIDManifest.xml文件中的应用程序标记上使用androID:largeHeap =“true”来超过64MB限制.这不适用于3.0之前的设备.
这可能会解决你的问题.如果仍然不够,您可以使用本机代码加载位图,其中堆限制是设备上的完整内存. NDK更加复杂,所以首先尝试上述解决方案.
总结以上是内存溢出为你收集整理的java – Android BitmapFactory.decodeResource需要太多内存全部内容,希望文章能够帮你解决java – Android BitmapFactory.decodeResource需要太多内存所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)