Android throwing out of memory error when trying to load 1 megabyte image

Deadly 提交于 2019-12-25 03:57:49

问题


The relevant code:

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

It's saying that the run method is making a 400-some megabyte allocation. My jpgs are no more than a megabyte in size. The run() method is called on a timer every 3-4 seconds or so and on click, but that shouldn't matter because from what I can tell using printlns the run() is only called once before the crash.

Edit: Here's the exception. Had to run it again to get this, it's a different amount of memory this time but still very large.

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)

回答1:


Try to use picasso library for loading large image.it's having inbuilt cache functionality.

Step 1: First write follow code in gradle.build and sync gradle.

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

Step 2:

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

and write above code where we load the image.in this code you must need to provide image path and make sure image path is valid.if you really want to learn something more about this Library than please Visit this.

I hope your are clear with my Idea.

Best of Luck




回答2:


Most likely the issue is that you are not clearing up the previously allocated space. Are you sure that the fragment/activity that loads these pictures is also removed from backstack? Or maybe the images themselves are not being garbage collected? Re-do the same steps that are causing the OutofMemory Exception but make sure to switch to Memory Monitor Tab in Android Studio and check where the Memory is increasing drastically but not being freed when it should be. This should give you a head start to see where the memory leak might be.

Also possible that there is no leak, rather your pictures themselves are huge (although doesnt seems to be). In this case you should do lazy loading, cache implementation etc. or just use some third party library like Picasso which handle this for you




回答3:


Alright, I figured it out. I'm using an lg g4, which uses xxxhdpi, and my images were in the drawable folder, not the drawable-xxxhdpi folder. This solved my problem without using picasso or the other methods.



来源:https://stackoverflow.com/questions/34491548/android-throwing-out-of-memory-error-when-trying-to-load-1-megabyte-image

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!