Xamarin:在视图中加载图像asyn

时间:2018-06-08 09:34:39

标签: c# asynchronous xamarin xamarin.forms task

我正在开发一款壁纸应用。因此我使用的是Xamarin.Forms。有一个包含所有可用壁纸的滚动视图,在其上方,用户可以看到所选壁纸更大。

问题在于,当我启动App时,我可以看到它有点滞后。 (图片正在加载中)我并不喜欢这样。看起来不太好。所以我开始了一个新任务,因为我从嵌入式资源中获取图像。但这并没有太多时间。耗时的是在视图中显示图像。我无法在任务中执行此操作,因为它必须是访问视图的STA线程。

我想这样:

应用程序启动您会看到正在运行的活动指示器 在不阻止UI线程的情况下从资源加载图像 图像被加载到视图中而不会阻止UI线程 活动指示消失,主网格出现在前面

So here is my code:

检查此pastebin代码。

谢谢。

好的,我没有解决问题,但我有一个解决方案:

Task.Factory.StartNew(() =>
        {
            return InitializeImages();
        }).ContinueWith(r =>
        {
            Device.BeginInvokeOnMainThread(() =>
            {
                if (r.Result == GlobalSettings.ImageCount)
                    ButtonsGrid.ColumnDefinitions[1].Width = 0;
                else
                    ButtonsGrid.ColumnDefinitions[1].Width = GridLength.Star;

                for (int i = 0; i < r.Result; i++)
                {
                    ImagesGrid.Children.Add(_previewImages[i]);
                    ImagesStackLayout.Children.Add(_images[i]);
                }
            });

            Thread.Sleep(2000);

            Device.BeginInvokeOnMainThread(async () =>
            {
                await ShowWallpaperInPreview();

                await Loading(false);
            });
        });

我让它在后台滞后。过了一会儿,我从加载变为普通视图。这种方式落后于背景(谁关心=)

1 个答案:

答案 0 :(得分:1)

让您的应用保持响应并覆盖问题中未提及的案例的非常好的候选者是名为FFImageLoading的开源项目。

以下是支持的功能列表:

  • 可配置的磁盘和内存缓存
  • 使用相同图像源(网址,路径,资源)的多个图片视图将仅使用一个缓存在内存中的位图(内存使用量减少)
  • 错误并加载占位符支持
  • 图像可以自动下采样到指定大小(内存使用量减少)
  • 可以重试图片下载(RetryCount,RetryDelay)

还有更多!

查看Advanced Usage docWiki了解详情。