如何在 Xamarin UWP 的 ListView 中释放内存?
How to release memory in ListView on Xamarin UWP?
我有一个 Xamarin.Forms UWP 应用程序,里面有一个 ListView。 listView 包含大图像等。加载后不久,当我开始滚动 ListView 时,发生 OutOfMemory 异常。我尝试使用分页将ListView变小,但多次点击Next后,还是出现异常。我想知道如何释放内存,例如单击下一步按钮。
这是一些代码:
<StackLayout>
<ListView x:Name="ProductView" Margin="20">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Source="{Binding Front_Image, StringFormat='https://cdn.mysite.com{0}'}" Grid.Column="0" />
<Label Text="{Binding Name}" Grid.Column="1" FontAttributes="Bold" VerticalOptions="Center" />
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Button x:Name="Prev" Text="Previous" Style="{StaticResource NavButton}" Clicked="OnPrevClicked" IsEnabled="false" />
<Button x:Name="Next" Text="Next" Style="{StaticResource NavButton}" Clicked="OnNextClicked" />
</StackLayout>
...
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class ProductsPage : ContentPage
{
//public ObservableCollection<Product> Products { get; set; }
private int PageNumber { get; set; } = 1;
public ProductsPage ()
{
InitializeComponent();
ProductView.ItemsSource = Product.GetProducts(PageNumber);
}
private void OnPrevClicked(object sender, EventArgs args)
{
ProductView.ItemsSource = Product.GetProducts(--PageNumber);
Prev.IsEnabled = PageNumber > 1;
}
private void OnNextClicked(object sender, EventArgs args)
{
ProductView.ItemsSource = Product.GetProducts(++PageNumber);
Prev.IsEnabled = true;
}
}
您可以做几件事。
首先我会替换原生 Image
并使用像 FFImageLoading.
这样的包
这个包提供了开箱即用的内存管理、缓存解决方案,这是一个很大的帮助。
您还可以查看 ListViews 缓存策略:RecycleElement,它将回收视图,而不是为每个元素创建多个 ViewCell。
我有一个 Xamarin.Forms UWP 应用程序,里面有一个 ListView。 listView 包含大图像等。加载后不久,当我开始滚动 ListView 时,发生 OutOfMemory 异常。我尝试使用分页将ListView变小,但多次点击Next后,还是出现异常。我想知道如何释放内存,例如单击下一步按钮。
这是一些代码:
<StackLayout>
<ListView x:Name="ProductView" Margin="20">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Source="{Binding Front_Image, StringFormat='https://cdn.mysite.com{0}'}" Grid.Column="0" />
<Label Text="{Binding Name}" Grid.Column="1" FontAttributes="Bold" VerticalOptions="Center" />
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Button x:Name="Prev" Text="Previous" Style="{StaticResource NavButton}" Clicked="OnPrevClicked" IsEnabled="false" />
<Button x:Name="Next" Text="Next" Style="{StaticResource NavButton}" Clicked="OnNextClicked" />
</StackLayout>
...
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class ProductsPage : ContentPage
{
//public ObservableCollection<Product> Products { get; set; }
private int PageNumber { get; set; } = 1;
public ProductsPage ()
{
InitializeComponent();
ProductView.ItemsSource = Product.GetProducts(PageNumber);
}
private void OnPrevClicked(object sender, EventArgs args)
{
ProductView.ItemsSource = Product.GetProducts(--PageNumber);
Prev.IsEnabled = PageNumber > 1;
}
private void OnNextClicked(object sender, EventArgs args)
{
ProductView.ItemsSource = Product.GetProducts(++PageNumber);
Prev.IsEnabled = true;
}
}
您可以做几件事。
首先我会替换原生 Image
并使用像 FFImageLoading.
这个包提供了开箱即用的内存管理、缓存解决方案,这是一个很大的帮助。
您还可以查看 ListViews 缓存策略:RecycleElement,它将回收视图,而不是为每个元素创建多个 ViewCell。