如何在 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。