如何处理内存

本文关键字:内存 处理 何处理 | 更新日期: 2023-09-27 18:10:01

在探索UWP时,我在尝试这个简单的应用程序时遇到了一个问题。我的应用程序自动关闭在Windows手机与512mb内存,因为有太多的内容和,我猜这是使手机运行的内存

我想问哪是正确的方法来加载内容而不使应用程序崩溃?我是否应该在屏幕末尾加载更多内容并加载一些内容并隐藏另一个内容,或者有其他更好的解决方案?

我读过一些关于UI虚拟化的内容,但我不知道如何在这种情况下实现它。请举个例子。

<ScrollViewer HorizontalScrollBarVisibility="Hidden" Height="500"  Loaded="Populate">
     <StackPanel x:Name="ContentsPanel"></StackPanel>
</ScrollViewer>
void Populate(object sender, RoutedEventArgs e)
{
    for (int i = 0; i < 1000; i++)
    {
       ContentsPanel.Children.Add(new TextBlock
       {
           Text = @"ipsumSed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
                totam rem aperiam,
                eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
                sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.Neque porro quisquam est,
                qui dolorem ipsum quia dolor sit amet,
                consectetur,
                adipisci velit,
                sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.Ut enim ad minima veniam,
                quis nostrum exercitationem ullam corporis suscipit laboriosam,
                nisi ut aliquid ex ea commodi consequatur ? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,
                vel illum qui dolorem eum fugiat quo voluptas nulla pariatur ? 
                At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
       });
    }
}

如何处理内存

大多数情况下,当内存耗尽时,是因为您加载了大型图像,或者您没有使用/已经破坏了虚拟化。这是一个过于简单的规则,但是,您不应该在滚动查看器中放置堆栈面板。如果你发现自己想要这样做,你可能想要的实际上是一个ListView绑定到某种ItemsSource (ObservableCollection<T>,如果你想要能够添加/删除的东西以后,或任何IEnumerable<T>,如果它完全静态。如果列表视图的内容是同构的,则可以使用ListView。如果内容是异构的,你可以使用ListView。ItemTemplateSelector为不同类型的项选择不同的模板。

当你使用ListView时,XAML运行时只会为当前显示在屏幕上的内容创建足够的UI控件+顶部和底部的一些控件,以确保滚动是平滑的。请注意,这是UI虚拟化,而不是内容虚拟化,因为您可以在绑定为ItemSource的类上实现ISupportIncrementalLoading。

编辑添加请求的示例:

<ListView x:Name="contentsList" HorizontalScrollBarVisibility="Hidden" Height="500"  Loaded="Populate">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" /> <!-- this is not actually needed in this example because its actually the default data template for a list view but ive included it for completeness -->
        </DataTemplate>
    </ListView.ItemTemplate>
<ListView>
void Populate(object sender, RoutedEventArgs e)
{
    var madeList = new List<string>()
    for(int i = 0; i < 1000; i++)
    {
        madeList.Add(@"ipsumSed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
                totam rem aperiam,
                eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
                sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.Neque porro quisquam est,
                qui dolorem ipsum quia dolor sit amet,
                consectetur,
                adipisci velit,
                sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.Ut enim ad minima veniam,
                quis nostrum exercitationem ullam corporis suscipit laboriosam,
                nisi ut aliquid ex ea commodi consequatur ? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur,
                vel illum qui dolorem eum fugiat quo voluptas nulla pariatur ? 
                At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.");
    }
    contentsList.ItemsSource = madeList;
}

您可以在滚动查看器结束时加载更多内容。如何发现ScrollViewer在WPF中滚动到最后?提供示例。