如何在 Xamarin UWP 上的 ListView 中释放内存?
Posted
技术标签:
【中文标题】如何在 Xamarin UWP 上的 ListView 中释放内存?【英文标题】:How to release memory in ListView on Xamarin UWP? 【发布时间】:2019-06-08 16:56:22 【问题描述】:我有一个 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.com0'" 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;
【问题讨论】:
【参考方案1】:你可以做几件事。
首先我会替换原生的Image
并使用像FFImageLoading 这样的包。
这个包为内存管理、缓存提供了开箱即用的解决方案,这是一个很大的帮助。
您还可以查看 ListViews Caching Strategies:RecycleElement,它将回收视图,而不是为每个元素创建多个 ViewCell。
【讨论】:
谢谢,我会试一试,告诉你结果。 很好,很高兴我能帮上忙 :) 除了@BrunoCaceiro 之外,我还想分享我的两分钱答案:我在内存优化方面遇到了一些问题,所以我还使用了IDisposable
接口实现来释放参数内存。 以上是关于如何在 Xamarin UWP 上的 ListView 中释放内存?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Xamarin UWP 上的 ListView 中释放内存?
如何解决 VS for Xamarin.Forms UWP 应用程序上的调试错误?
Xamarin Form - 如何在 UWP 中选中另一个复选框上的复选框
如何将 UWP 目标添加到现有 Xamarin Forms 项目?