【问题标题】:Run function in background while leaving UI interactable C# Xamarin在后台运行函数,同时保持 UI 可交互 C# Xamarin
【发布时间】:2020-08-08 18:26:01
【问题描述】:

我想在后台运行这个函数

        private void SetPosters()
        {
            foreach(var i in posters)
            { 
                i.SetImageBitmap(GetImageBitmapFromUrl(getLinkfromTag((i.Tag).ToString())));
            }
        }
        private static string getLinkfromTag(String tag)
        {
            String Link = "-";
            foreach(var i in movies_Arr)
            {
                if(i.Id == tag)
                {
                    Link = i.HorizontalPoster;
                }
            }
            return Link;
        }
        private static Bitmap GetImageBitmapFromUrl(string url)
        {
            Bitmap imageBitmap = null;

            using (var webClient = new WebClient())
            {
                var imageBytes = webClient.DownloadData(url);
                if (imageBytes != null && imageBytes.Length > 0)
                {
                    imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
                }
            }

            return imageBitmap;
        }

从网络下载图像时,我无法与我的 UI 交互

其他信息 -

posters 是一个列表视图,包含来自活动的所有图像视图 movies_Arr 是一个包含海报链接的列表视图

【问题讨论】:

  • 看看异步/等待
  • 有趣的部分是你忘记了过去的 SetImageBitmap 代码,因为你必须异步运行除此方法中的所有代码外,必须在 ui 线程上运行才能访问 ui 元素

标签: c# android .net xamarin xamarin.android


【解决方案1】:

您可以通过执行CommandSetPosters 命令或仅调用LaunchPosters() 来使用即发即弃的方法运行您的方法。不会等待执行,完全异步。请注意,我们在 ui 踏板上调用 SetImageBitmap,否则您将无法正确访问 UI 元素。

 public ICommand CommandSetPosters
    {
        get
        {
            return new Command<object>((object context) =>
            {
                LaunchPosters(context);
            });
        }
    }

    public void LaunchPosters(object param)
    {
        Task.Run(async () =>
        {
            //can use param from command if needed
            SetPosters();

        }).ConfigureAwait(false);
    }

private void SetPosters()
{
    foreach (var i in posters)
    {
        var bitmap = GetImageBitmapFromUrl(getLinkfromTag((i.Tag).ToString()));


        Device.BeginInvokeOnMainThread(() =>
        {
            // Update the UI
            i.SetImageBitmap(bitmap);
        });

    }
}

【讨论】:

  • 嗯,我很抱歉,我对这个什么是 ICommand 真的很陌生,当我在网上查看时,它给了 {Binding Path=UpdateCommand} 这个,但我动态创建了图像视图,所以我不能这样做
  • 如上所述,如果您不想使用命令,只需运行 LaunchPosters(null);
猜你喜欢
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多