首页 > 解决方案 > 为什么使用 ArrayList 的循环创建 ImageViews 会导致内存错误?

问题描述

我正在开发一个 Android 应用程序,我来到了应用程序的一部分,我需要获取一个 ArrayList 并为 ArrayList 中的每个字符串创建一个 ImageView。这些将沿布局底部显示并水平滚动。

我一直在使用的代码是:

ArrayList<String> selectedUser = userInformation.getUserArrayList();
LinearLayout holderGUI = findViewById(R.id.holder);
Integer i = 0;
ImageView newImg;
do {
    newImg = new ImageView(this);
    Integer id = getResources().getIdentifier(selectedUser.get(i),"drawable",getPackageName());
    newImg.setImageResource(id);
    newImg.setContentDescription(selectedUser.get(i));
    newImg.setAdjustViewBounds(true);
    newImg.setScaleType(ImageView.ScaleType.FIT_CENTER);
    holderGUI.addView(newImg);
    i++;
} while (i < selectedUser.size());

此代码运行良好,因为应用程序上的每个图像文件都与 ArrayList 中可能的字符串匹配。但是,此循环仅在应用程序因内存分配错误而崩溃之前迭代了 3 次。我尝试在循环中获取代码块并将其粘贴五次以确保循环没有问题,但我得到了相同的结果。

有没有更有效的方法来做到这一点,还是我出了什么问题?任何帮助,将不胜感激。

标签: javaandroid

解决方案


如果字符串大小很大,则将字符串转换为图像时会导致 OutOfMemoryError 并引发异常,因此您需要处理它。

android:largeHeap="true"
android:hardwareAccelerated="false"

在 Manifest Application 标签中添加以上行。

boolean isOutOfMemory = false;

try{
    // Your Code here.
    }catch (OutOfMemoryError ex) {
        System.gc();                // clean up largeVar data
        isOutOfMemory = true;       // flag available for use
    }

在 try catch 块中添加您的代码。我希望这对你有用。


推荐阅读