【问题标题】:How to solve the Out of Memory issue while displaying image in android?在android中显示图像时如何解决内存不足问题?
【发布时间】:2012-08-18 07:18:02
【问题描述】:

我正在开发一个测验应用程序。我在列表中显示问题和选项。我在顶部保留了一个下一个按钮,当单击下一个按钮时,我 一遍又一遍地调用同一个页面,直到测试结束。 由于某些问题由图像组成,因此我在问题下方显示了一个按钮,当单击该按钮时,该图像将显示在新页面中。 现在我的问题是有时当我单击按钮显示图像时,它正在显示outofmemory 异常。

image.java

public class image extends Activity {

    ImageView myimgview;
    ImageView buttondismiss;

    public static String image_url;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.image);

        Intent intent = getIntent();
        image_url = intent.getStringExtra(List.IMAGE_NAME);

        buttondismiss = (ImageView) findViewById(R.id.dismiss1);

        myimgview = (ImageView) findViewById(R.id.imageView100);

        int in = image_url.indexOf(".");
        String index = Integer.toString(in);
        String picturename = image_url.substring(0, in);

        int imageResource = getResources().getIdentifier(picturename,"drawable", "com.quiz.test");                                              // getPackageName());
        myimgview = (ImageView) findViewById(R.id.imageView100);
        myimgview.setImageResource(imageResource);

    }


}

Logcat:

08-18 11:11:01.063: E/AndroidRuntime(552): FATAL EXCEPTION: main
08-18 11:11:01.063: E/AndroidRuntime(552): java.lang.OutOfMemoryError
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:483)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.content.res.Resources.loadDrawable(Resources.java:1937)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.content.res.Resources.getDrawable(Resources.java:664)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.widget.ImageView.resolveUri(ImageView.java:542)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.widget.ImageView.setImageResource(ImageView.java:315)
08-18 11:11:01.063: E/AndroidRuntime(552):  at com.quiz.test.image.onCreate(image.java:48)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.app.Activity.performCreate(Activity.java:4465)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.os.Looper.loop(Looper.java:137)
08-18 11:11:01.063: E/AndroidRuntime(552):  at android.app.ActivityThread.main(ActivityThread.java:4340)
08-18 11:11:01.063: E/AndroidRuntime(552):  at java.lang.reflect.Method.invokeNative(Native Method)
08-18 11:11:01.063: E/AndroidRuntime(552):  at java.lang.reflect.Method.invoke(Method.java:511)
08-18 11:11:01.063: E/AndroidRuntime(552):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-18 11:11:01.063: E/AndroidRuntime(552):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-18 11:11:01.063: E/AndroidRuntime(552):  at dalvik.system.NativeStart.main(Native Method)

错误显示在 myimgview.setImageResource(imageResource); 行。我没有得到什么问题。我在我的可绘制文件夹中保留了多达 400 张图像,因为我 在我的项目中需要所有这些图像。任何人都请帮我解决这个问题。我正在努力解决这个问题。任何帮助将不胜感激。

【问题讨论】:

  • 告诉我imageResource的类型和它包含什么???
  • 请看我的回答:stackoverflow.com/questions/10737582/…。 OOME 即将到来的情况可能不是您的确切情况,但它具有解决 OOME 问题的所有方法。如果它解决了您的问题,请不要忘记支持我的回答。谢谢:)

标签: android out-of-memory


【解决方案1】:

OutOfMemory Error 出现在某些图像可能太大而无法显示时。

要解决此问题,您可以执行以下操作:

BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 8;
Bitmap preview_bitmap=BitmapFactory.decodeStream(is,null,options);

【讨论】:

    【解决方案2】:

    使用较小的图像。就是这样。在使用之前尝试减小图像大小。

    【讨论】:

      【解决方案3】:

      在显示图像之前,根据屏幕尺寸将图像缩小到 ImageView 的尺寸,这样您就不会在低分辨率屏幕上显示高分辨率图像。这样会节省很多内存。

      【讨论】:

        【解决方案4】:

        这可以帮助您实用地减小图像的大小

        public Bitmap decodeFile(File f) {
            try {
                // Decode image size
                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(new FileInputStream(f), null, o);
                // The new size we want to scale to
                final int REQUIRED_SIZE = 70;
        
                // Find the correct scale value. It should be the power of 2.
                int scale = 1;
                while (o.outWidth / scale / 2 >= REQUIRED_SIZE
                        && o.outHeight / scale / 2 >= REQUIRED_SIZE)
                    scale *= 2;
                // Decode with inSampleSize
                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize = scale;
                return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
            } catch (FileNotFoundException e) {
            }
            return null;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多