java - 更改 vector 图像的色调颜色时出现 OutOfMemoryError 错误

标签 java android out-of-memory android-image

我至少有 48 张小图像,它们显示的是存储为可绘制 XML 文件的 vector 图像。我有一个包含 48 个项目的多选 ListView 。当一个项目被选中时,我访问它的图像对应物并改变图像的色调。如果少于(大约)30 项被检查,则没有问题,但如果超过,则显示 OutOfMemoryError。以下是代码示例:

   View.OnClickListener listener= new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               SparseBooleanArray checked = listView.getCheckedItemPositions();
               for (int i = 0; i < checked.size(); i++) {
                   // Item position in adapter
                   int position = checked.keyAt(i);
                   // Add sport if it is checked i.e.) == TRUE!
                   image = null;
                   if (checked.valueAt(i)) {
                       switch (position) {
                           case 1:
                               image = (ImageView) findViewById(R.id.image1);
                               image.setColorFilter(R.color.green);
                               break;
                           case 2:
                               image = (ImageView) findViewById(R.id.image2);
                               image.setColorFilter(R.color.green);
                               break;
                           case 3:
                               image = (ImageView) findViewById(R.id.image3);
                               image.setColorFilter(R.color.green);
                               break;
                            ....
                            case:48
                               image = (ImageView) findViewById(R.id.image48);
                               image.setColorFilter(R.color.green);
                               break;
                               }
                           }
                     }
 mybutton.OnClickListener(listener)

xml文件中的图片示例

<RelativeLayout>
        <ImageView
            android:layout_width="400dp"
            android:layout_height="400dp"
            android:src="@drawable/img45"
            android:id="@+id/image1"
            />
        <ImageView
            android:layout_width="400dp"
            android:layout_height="400dp"
            android:src="@drawable/img45"
            android:id="@+id/image2"
            />
....
        <ImageView
            android:layout_width="400dp"
            android:layout_height="400dp"
            android:src="@drawable/img45"
            android:id="@+id/image48"
            />
</RelativeLayout>

这个问题似乎是Bitmap图片的通病,但是前面问题中提出的解决方案并不适合我的情况。你认为如果我将图像的 src 从 xml vector 更改为简单的 png 会解决问题吗?如果没有,有什么建议吗?

最佳答案

您正在为每个图像创建一个单独的滤色器。创建一个单一的滤色器并在所有图像上使用它会减少对象的使用。但是,如果 ImageView 立即创建一个带有阴影的新位图,无论如何你都会 OOM - 你在这里创建了 48 个新位图,这是一个巨大的内存量。

其次,每次检查单个项目时,您都在为所有图像创建新的过滤器。那是非常低效的(特别是因为你在每种情况下都有 n 次搜索)并且会使上一段中的问题变得更糟。仅更改在每个单击处理程序中单击的单个项目。在这场 war 中这样做会创建总和(i=1 到 n)i 个新图像,其中 n 是点击的图像数量 - 对于 n=30,即 430ish。

顺便说一句 - 在这里使用 switch 语句很糟糕。在开始时创建一个 imageViews 数组并索引到数组中,而不是每次都使用 findViewById 在 View 树中进行 O(n) 搜索。这段代码很糟糕。

关于java - 更改 vector 图像的色调颜色时出现 OutOfMemoryError 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34623277/

相关文章:

java - JSF 将 OutputText 和 InputText 值传递给属性

java - 如何提高spring mvc批量事务的性能

Python:MemoryError、OverflowError、即时系统卡住

java - 多态性 - 简单

java - 如何从 Webview 的页面内部获取 json 响应(我使用用户代理获取响应)?

android - 在哪里可以获得适用于 OS X 10.8.1 (Mountain Lion) 的英特尔硬件加速执行管理器 (HAXM) 驱动程序?

android - 如何在单个布局程序化中添加多个布局

android - Coordinator布局和权重

apache-spark - PySpark 数据帧操作导致 OutOfMemoryError

java - JVM 到底什么时候抛出 OutOfMemoryError