java - 为什么使用 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 次。我尝试在循环中获取代码块并将其粘贴五次以确保循环没有问题,但我得到了相同的结果。
有没有更有效的方法来做到这一点,还是我出了什么问题?任何帮助,将不胜感激。
解决方案
如果字符串大小很大,则将字符串转换为图像时会导致 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 块中添加您的代码。我希望这对你有用。
推荐阅读
- sql - 如何将所有子组折叠成一行并保持相同的顺序
- c# - 从 SELECT 语句生成/返回空数据时,如何导致 U-SQL 脚本失败?
- docker - microsoft .net core 2.2 sdk docker 容器能否用于构建 2.1 和 2.2 目标项目
- html - 如何将对象数组绑定到 ionic 4 中的视图?
- python - 在特定 div 的 span 类中获取文本
- sql - 铅和分区功能
- jms - 接收方未读取 MQ 消息上的 ApplIdentity 数据集
- python - 使用 Xbee 和 Rapberry 的面包屑网络
- azure-cognitive-search - 如何使用字母数字字符和破折号为通配符搜索索引字段
- java - Spring Boot 查询中的动态过滤器