如何在 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 项目?

Xamarin Form - 如何在 UWP 中为 MyToolkit.Controls.DataGrid 设置样式

如何更改 Xamarin UWP 应用名称