如何解决在安卓系统中显示图片时的内存不足问题?

3
我正在开发一款测验应用程序。在其中,我将问题和选项显示在列表中。我在顶部放置了一个“下一步”按钮,当点击该按钮时,我会重复调用相同的页面,直到测试结束。 由于某些问题包含图片,因此我在问题下方显示了一个按钮,当单击该按钮时,图像将显示在新页面中。 现在我的问题是,有时当我单击按钮以显示图像时,它会显示“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);

    }


}

日志记录:

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);。我不知道问题出在哪里。我在drawable文件夹中保存了400张图片,因为我需要在我的项目中使用所有这些图片。请有经验的人帮助我解决这个问题。我正在为此问题苦苦挣扎。非常感谢任何帮助。

告诉我imageResource的类型以及它包含的内容是什么? - Hardikgiri Goswami
1
请查看我的答案:https://dev59.com/2mTWa4cB1Zd3GeqPAzTW#10738115。这可能不是您遇到的确切情况,但它提供了解决OOME问题的所有方法。如果它解决了您的问题,请不要忘记给我的答案点赞。谢谢 :) - Shrikant Ballal
4个回答

4
OutOfMemory Error指的是某些图像太大而无法显示时出现的错误。
要解决这个问题,可以采取以下措施:
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 8;
Bitmap preview_bitmap=BitmapFactory.decodeStream(is,null,options);

0

这可能会帮助您以编程方式减小图像的大小

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;
}

0

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


0

在显示图片之前,根据屏幕大小将图像缩小到ImageView的尺寸,以避免在低分辨率屏幕上显示高分辨率图像。这将节省大量内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接