Использование ресурса из другого проекта в Xamarin.Forms - PullRequest
0 голосов
/ 01 ноября 2018

Я разрабатывал элемент пользовательского интерфейса в Xamarin.Forms, который имеет свойства двух изображений. Сам элемент интерфейса не имеет изображения, поэтому я должен предоставить его извне.

Я пробовал много вещей, но это не работает. Наконец я сделал это с помощью изображений в проекте 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>

и в событии my bindable property я называю как

button.BackgroundImage = ImageSource.FromFile(enabledImageSource);

или

button.BackgroundImage = ImageSource.FromFile(disabledImageSource);

Если я несколько раз изменю свойство IsButtonActive, то получу исключение выше. Как я понимаю, он как-то не очищается из памяти и использует путь вместо прямого ресурса.

PS: ресурсы были настроены как ресурсы Android, и я использую реальное устройство, и размер изображения составляет 27 КБ

1 Ответ

0 голосов
/ 01 ноября 2018

Ваш OutOfMemoryError не связан с привязками. Это связано с размером изображений (в пикселях и / или байтах). Более подробную информацию о OOM можно найти здесь .

Вы можете найти полезным использование Сборка мусора . Больше информации об этом найдено здесь .

Похоже, ваш код загружает одни и те же два изображения снова и снова в память, не удаляя их (следовательно, использование Сборки мусора может быть полезным). В качестве альтернативы вам лучше создавать статические объекты, содержащие изображения, которые вы хотите отобразить. Например:

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;
}

То, что я здесь сделал, создано только для двух экземпляров включения / выключения изображений. Затем я вызываю эти экземпляры, чтобы снова и снова создавать новые экземпляры одних и тех же изображений.

...