0

我的ImageView是在Activity布局中定义的,没有ListView或者GridView,所以这里没有自动视图回收。每当加载活动时,我都会在 logcat 中出现“java.lang.IllegalArgumentException:无法绘制回收的位图”崩溃。这是我的 ImageView 的样式。如您所见,这里没有什么特别之处。该图像唯一值得注意的是它非常大(Nexus 10 的全屏尺寸)。我知道这个观点是罪魁祸首,因为注释掉它可以解决错误。

<style name="tabletbackground">
    <item name="android:scaleType">centerCrop</item>
    <item name="android:src">@drawable/loading_background</item>
    <item name="android:contentDescription">background image</item>
    <item name="android:layout_width">fill_parent</item>
    <item name="android:layout_height">fill_parent</item>
</style>

此 Activity 的代码中没有任何地方调用回收位图。知道这里发生了什么吗?

这是一些好奇的布局。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    style="@style/news_act_root" >

    <ImageView
        style="@style/tabletbackground"
        android:id="@+id/tabletbackground" />

    <!-- redacted -->
</RelativeLayout>
4

2 回答 2

1

(已编辑。我最初的猜测是它是由别名引起的,这对阅读本文的人来说会产生误导和混淆。)

好吧,看起来我偶然发现了一个解决方案。

我在之前显示的 Activity 中引用了相同的可绘制对象,并且确实在那里回收了它。这不应该导致错误,对吧?嗯,确实如此。

所以不要指望布局充气器会给你一个新的drawable。如果有一个,它可能会给你一个之前膨胀的。

于 2013-05-18T12:49:27.027 回答
0

我认为问题是缩放!缩放部分,返回一个新图像。但是当不需要缩放时,它会再次返回旧实例。系统回收旧镜像,所以新镜像也会回收!你得到“无法绘制回收的位图”删除“scaleType”属性并再次测试。

于 2013-05-18T12:53:00.770 回答