尝试加载1兆字节图像时Android丢失内存错误

时间:2015-12-28 10:14:10

标签: android out-of-memory android-imageview

相关代码:

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            ImageButton btn = (ImageButton) findViewById(R.id.info_image);
            btn.setImageResource(currentID[currentIDPos]);
        }
    });

它说run方法正在进行400兆字节的分配。我的jpgs大小不超过兆字节。 run()方法每隔3-4秒左右在一个计时器上调用,然后单击,但这不重要,因为我可以使用printlns告诉run()只在崩溃之前调用一次。 / p>

编辑:这是例外。不得不再次运行才能得到它,这次它的内存量不同但仍然非常大。

FATAL EXCEPTION: main
                                                                Process: com.grey.handsaver, PID: 32531
                                                                java.lang.OutOfMemoryError: Failed to allocate a 215151564 byte allocation with 33554400 free bytes and 100MB 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:988)
                                                                    at android.content.res.Resources.loadDrawableForCookie(Resources.java:2580)
                                                                    at android.content.res.Resources.loadDrawable(Resources.java:2487)
                                                                    at android.content.res.Resources.getDrawable(Resources.java:814)
                                                                    at android.content.res.XResources.getDrawable(XResources.java:572)
                                                                    at android.content.Context.getDrawable(Context.java:403)
                                                                    at android.widget.ImageView.resolveUri(ImageView.java:747)
                                                                    at android.widget.ImageView.setImageResource(ImageView.java:398)
                                                                    at com.grey.handsaver.ExerciseInfoActivity$3.run(ExerciseInfoActivity.java:128)
                                                                    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:5430)
                                                                    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:913)
                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:706)
                                                                    at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115)

3 个答案:

答案 0 :(得分:0)

尝试使用picasso库加载大型image.it具有内置缓存功能。

第1步: 首先在gradle.build和sync gradle中编写以下代码。

compile 'com.squareup.picasso:picasso:2.5.2'

第2步:

Picasso.with(context).load("YOUR IMAGE PATH").into(btn);

并在我们加载图片的上面写下代码。在此代码中,您必须提供图片路径并确保图片路径有效。如果您真的想要了解有关此库的更多信息,请访问this

我希望你对我的想法很清楚。

最好的运气

答案 1 :(得分:0)

最有可能的问题是您没有清理以前分配的空间。你确定加载这些图片的片段/活动也从backstack中删除了吗?或者图像本身可能没有被垃圾收集? 重新执行导致OutofMemory异常的相同步骤,但确保切换到Android Studio中的Memory Monitor选项卡,并检查内存大幅增加的位置,但不应该在应用时释放。这应该让您先了解内存泄漏的位置。

也可能没有泄漏,而你的照片本身就很大(虽然似乎不是)。在这种情况下,你应该进行延迟加载,缓存实现等,或者只是使用像Picasso这样的第三方库来处理这个问题

答案 2 :(得分:0)

好吧,我明白了。我使用的是使用xxxhdpi的lg g4,我的图像位于drawable文件夹中,而不是drawable-xxxhdpi文件夹中。这解决了我的问题,没有使用毕加索或其他方法。