【问题标题】:How to efficiently load multiple images dynamically from Stream?如何有效地从 Stream 动态加载多个图像?
【发布时间】:2021-10-27 09:36:15
【问题描述】:

我需要在一个列表中加载并显示多个图像。想象一个“相册”列表,每个相册都包含多张图片 - 我想显示这些相册的列表以及前 4 张图片的缩略图。

如果我将图像作为普通 URL,我可以简单地创建字符串属性,设置 URL 并将它们在 XAML 中绑定到图像的源。该框架将处理图像的加载、渲染和可能的缓存。

但我有从流中加载图像的技术要求,即通过特定逻辑获取图像。我现在正在努力解决如何在我的 ViewModel 中提供 Streams,以便 View 只加载要显示的 Image-Streams 并以有效的方式执行此操作。我设法通过在 ViewModel 中创建 BitmapImages 并使用相应的流调用它们的 SetSourceAsync-Method 来做到这一点。但我要么陷入线程问题(似乎只允许由 UI 线程创建 BitmapImage),要么在从我的流中加载图像时应用程序在 Android 上出现口吃。似乎加载仍在 UI 线程上完成。

有人有处理这个问题的好方法吗?我什至会欣赏这些流的某种缓存。

提前谢谢你!

亲切的问候,

TopperDEL

*** 2021 年 9 月 1 日更新 *** 我设法通过使用 Skiasharp 渲染位图来解决这个问题。基本上我创建了一个用户控件,其中包括一个 Skiasharp“SKXamlCanvas”。一旦我得到我的流,我创建一个 SKBitmap 并在 Canvas 上绘制它。到目前为止,我还没有遇到任何问题。

代码可以看这里:Github

【问题讨论】:

  • 您是否考虑过在视图模型中使用WorkerCoroutine
  • (a BitmapImage is only allowed to be created by a UI-thread 难以置信,因为它没有 gui 元素。但是把它放在一个视图中应该在 ui 线程上完成。
  • 是的,但这是真的 - 如果我尝试在不是 UI 线程的异步方法中创建 BitmapImage,它会因“错误线程”而崩溃(我这里只有德语错误消息) .
  • Ethan,你能详细说明一下你的意思吗?

标签: c# android ios uwp uno-platform


【解决方案1】:

是的,但这是真的 - 如果我尝试在不是 UI 线程的异步方法中创建 BitmapImage,它会因“错误线程”而崩溃(我这里只有德语错误消息)

是的。默认情况下,我们无法在非uithread中创建BitmapImage,对于上述情况,我们建议使用dispatcher回调UI-thread。

await Window.Current.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
    // create bitmap here 
});

【讨论】:

  • 这就是我所做的——这在 UWP 本身上效果很好。但是当我在这里使用 Uno 时,它会在 BitmapImage.SetSourceAsync() 上产生巨大的滞后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多