【问题标题】:How to release memory in ListView on Xamarin UWP?如何在 Xamarin UWP 上的 ListView 中释放内存?
【发布时间】: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.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;
    }
}

【问题讨论】:

    标签: listview xamarin.forms xamarin.uwp


    【解决方案1】:

    你可以做几件事。

    首先我会替换原生的Image 并使用像FFImageLoading 这样的包。

    这个包为内存管理、缓存提供了开箱即用的解决方案,这是一个很大的帮助。

    您还可以查看 ListViews Caching Strategies:RecycleElement,它将回收视图,而不是为每个元素创建多个 ViewCell。

    【讨论】:

    • 谢谢,我会试一试,告诉你结果。
    • 很好,很高兴我能帮上忙 :)
    • 除了@BrunoCaceiro 之外,我还想分享我的两分钱答案:我在内存优化方面遇到了一些问题,所以我还使用了IDisposable 接口实现来释放参数内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2010-12-06
    • 2011-12-08
    相关资源
    最近更新 更多