Xamarin表单列表视图内存不足错误

时间:2017-03-29 22:24:41

标签: xamarin xamarin.forms

在Xamarin Forms中,我有以下列表视图:

<ListView x:Name="StudentView"  RowHeight="55"  SeparatorVisibility="None" CachingStrategy="RecycleElement">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="55"></RowDefinition>
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"></ColumnDefinition>
                        <ColumnDefinition Width="*"></ColumnDefinition>
                    </Grid.ColumnDefinitions>

                    <Image Source="{Binding Image}" Grid.Row="0" Grid.Column="0" Aspect="AspectFill"></Image>
                    <Image Source="{Binding Image}" Grid.Row="0" Grid.Column="1" Aspect="AspectFill"></Image>
                </Grid>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

在后面的代码中,我声明了一个包含1000个项目的数组。

问题在于,如果我在列表视图中向上和向下滚动,每次我在xamarin配置文件中看到内存使用量增加并且似乎CachingStrategy =&#34; RecycleElement&#34;不能正常工作(在真正的Android设备上测试)。

滚动一段时间后,程序因内存不足而崩溃。

问题是什么?我该如何解决?

3 个答案:

答案 0 :(得分:0)

不确定如何设置列表视图的ItemSource,或者它是什么。为此显示一些代码隐藏文件也很有用。

如果您的来源不可转化,那么如果盲目猜测回收可能会出现性能问题。 Xamarin的建议是使用IList作为itemsource,使用像IEnumerable这样的东西会导致大型数组的性能问题,因为它基本上必须循环遍历数据才能找到合适的项目进行显示。

答案 1 :(得分:0)

1000个图像项目很多!我打赌这是Android,我建议使用不同的解决方案,如:

1.- Pagging策略(Load 10,负载另外10等)。 2.-减小图像尺寸。 3.-使用可缓存的图像,如: https://github.com/luberda-molinet/FFImageLoading 4.-使用Recycler视图实现View自定义渲染器。

然后关于如何提高ListView性能的话题越来越大,这里有一些有用的链接:

- https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/performance/

- https://blog.xamarin.com/creating-highly-performant-smooth-scrolling-android-listviews/

- https://blog.xamarin.com/tips-for-creating-a-smooth-and-fluid-android-ui/

- http://kent-boogaart.com/blog/jason-smith's-xamarin-forms-performance-tips

答案 2 :(得分:0)

我遇到了同样的问题,大量的图片或大分辨率的图片导致了这个问题,我使用Gson gson = new GsonBuilder() .registerTypeAdapter(ApiResponsePerson.class, new DeserializerApiResponsePerson()) .create(); 找到here解决了这个问题,也可以在nuget上找到,同时尝试如果可能的话,绑定缩略图而不是实际的图像。

FFImageLoading