我一直在Xamarin.Forms中开发一个自定义UI元素,该元素具有2个图像绑定属性。 UI元素本身没有任何图像,因此我必须在外部提供它。
我尝试了很多事情,但是没有用。最终,我通过使用android项目(位于Resources \ drawable文件夹中)中的图像来做到这一点,但是当我更改图像时,出现了错误。
Throwing OutOfMemoryError "Failed to allocate a 20266212 byte allocation
with 12787592 free bytes and 12MB until OOM" load image from file
和我的代码:
<StackLayout Grid.Row="1">
<customelements:CustomImageButton
x:Name="btnReadout"
ButtonText="Read"
ImageButton_Tapped="CustomImageButton_ImageButton_Tapped"
DisabledImageSource="read_disabled.png"
EnabledImageSource="read_enabled.png"
IsButtonActive="True"
/>
</StackLayout>
在我的可绑定属性事件中,我像
一样呼叫button.BackgroundImage = ImageSource.FromFile(enabledImageSource);
或
button.BackgroundImage = ImageSource.FromFile(disabledImageSource);
如果我多次更改IsButtonActive属性,则会出现上述异常。据我了解,不知何故它没有从内存中清除,而是使用路径而不是直接资源。
PS:资源已设置为android资源,我使用的是真实设备,图像大小为27 kb
答案 0 :(得分:0)
您的OutOfMemoryError
与绑定无关。它与图像的大小(像素和/或字节)有关。有关OOM的更多信息,请参见here。
使用垃圾收集可能会有用。有关here的更多信息。
听起来您的代码将相同的两张图像一遍又一遍地加载到内存中而不进行处理(因此,使用垃圾回收可能会很有用)。或者,最好创建包含要显示图像的静态对象。例如:
private static FileImageSource enabledImageSource = ImageSource.FromFile("enabledImage");
private static FileImageSource disabledImageSource = ImageSource.FromFile("disabledImage");
/* --- Further down the code --- */
private void EnableView(bool enable)
{
button.BackgroundImage =
enable ?
enabledImageSource :
disabledImageSource;
}
我在这里所做的只是创建两个启用/禁用图像实例。然后,我打电话给那些实例,以防止一遍又一遍地创建相同图像的新实例。