Xamarin.Forms - 页面缓存
Posted
技术标签:
【中文标题】Xamarin.Forms - 页面缓存【英文标题】:Xamarin.Forms - Page caching 【发布时间】:2015-05-19 10:16:02 【问题描述】:我正在使用 Xamarin.Forms 构建一个应用程序,并且我有一个“图库页面”。此页面包含许多正在加载到页面中的图像。
图像的加载需要相当长的时间,当导航到另一个页面,然后使用 Navigation.PopAsync 和 Navigation.PushAsync 返回时,需要再次重建整个页面(照片正在重新加载)。
我已经尝试缓存页面(所以不是一直在做 Navigation.PushAsync(new GalleryPage()),而是将它保存在一个变量中,但这没有区别。
有谁知道如何缓存整个页面,所以不需要重新加载?
谢谢
【问题讨论】:
【参考方案1】:如果您将页面对象保存在变量中,那么您正在这样做
Page myPage = new Page();
Navigation.PushAsync(myPage);
以后再做
Navigation.PushAsync(myPage);
这当然应该让页面加载在内存中。
图像通常也会被缓存。因此,如果您从 URL 获取它们,那么它们将被缓存。
如果您从数据库中获取它们,这可能是您延迟的原因,尤其是当您要求它去刷新列表时。
【讨论】:
我试过了,图片是从文件系统加载的。但是,当页面被推回堆栈时,在页面显示之前会有很长的延迟。 (它在显示之前完全绘制页面,收到许多消息,例如“[Choreographer] 跳过 486 帧!应用程序可能在其主线程上做了太多工作。”)。 “OnAppearing”方法中没有代码。 我需要查看您的代码才能为您提供更多指导。您似乎正在超载 UI 线程,这也可能是模拟器问题。您的代码如何在真正的 android 设备上运行? 如果您想显示 View 代码,我们可以为您提供更多指导,看看您是否有 Grid、ListView、StackLayout 等。【参考方案2】:问题可能在于您显示的图像的大小和数量。
我分两步处理了同样的问题:
Create thumbnails - 加载大图像需要更长的时间,如果屏幕上有很多图像,它们都是很小的。当它们进入并存储缩略图时,将它们按比例缩小可能是值得的。当缩略图可能是 20-30K 时,相机来源的图像可能是 5-8Mb。每次显示时,大图像也必须按比例缩小。
使用ListView
显示图像,而不是使用任何Grid
、StackLayout
或您可能拥有的任何其他内容。不同之处在于 ListView 更动态地呈现,它仅在它们即将显示时创建行,因此并非所有图像都加载到内存中。或者,您可以创建自己的逻辑来动态加载和卸载图像。需要注意的最坏情况是使用填充图像的滚动视图 - 即使它们不在屏幕上,它们也可能会尝试渲染
【讨论】:
感谢您的反应,我们已经在使用缩略图,但没有使用列表视图。我会试一试,会尽快回来。 我刚刚检查了一些关于 Listviews 的事情,我有一个问题。我们正在尝试创建一个像这个例子 (sapegin.github.io/jquery.mosaicflow) 的画廊。只是不同尺寸的图像。列表视图是否可以这样做,因为没有列? 我认为您无法以合理的方式在列表视图中执行此操作。您可以实现本机解决方案并为其创建自定义渲染(更好的性能,更多代码),或者您可以使用标准 XF 视图构建一个(性能较低,操作更简单) 整点保持不变:只有与至少部分可见或即将出现的图像相对应的 UI 元素,而忽略不可见的图像 滚动视图不应该为你做那件事吗?以上是关于Xamarin.Forms - 页面缓存的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Forms UWP 项目不会安装在 Windows 10 移动版上
Xamarin Forms Shell - 一次加载每个选项卡 - 急切加载而不是延迟加载
Xamarin.Forms - 创建新页面时 InitializeComponent 不存在