gpt4 book ai didi

c# - 使用 Xamarin 显示 Android ProgressBar

转载 作者:行者123 更新时间:2023-11-29 19:38:28 25 4
gpt4 key购买 nike

我正在通过 Xamarin/MonoTouch 构建一个 Android 应用程序(因此使用 C# 而不是 Java),并希望在该应用程序与服务器通信时显示 ProgressBar。我一直在尝试使用异步来执行此操作,但我对线程的工作原理不太了解,并且在过去的几个小时里我一直遇到同样的问题 - ProgressBar 在我的方法调用之后而不是之前显示.我的代码在 OnCreate() 方法中,我也已将其重写为异步。在这里:

        loginButton.Click += async (sender, e) =>
{
progbar.Visibility = ViewStates.Visible;

var userFetcher = new UserFetcher();
var json = await userFetcher.FetchUserDetailsAsync(/*parameters*/);
//the above method is async and returns a Task<JsonValue>
ParseUserDetails(json); //another method I created

progbar.Visibility = ViewStates.Invisible;
//do some stuff using the parsed data
};

我遇到的问题是 FetchUserDetailsAsync 似乎阻塞了我的线程。我一直在通过关闭服务器来测试它,这样它需要很长的响应时间(但即使我测试像 Thread.Sleep(5000) 这样的东西,我也有同样的问题)。调用该方法后,它会依次运行 progbar.Visibility = ViewStates.Visible;progbar.Visibility = ViewStates.Invisible; - 我知道这是因为当我注释掉 Invisible 部分时,ProgressBar 在我的方法得到服务器的“响应”后出现。编译器也一直给我这样的消息:“跳过 67 帧!应用程序可能在其主线程上做了太多工作。”

正如我之前所说,我在线程方面并没有真正的经验,所以很可能我只是天真地做错了什么。有人能解决这个问题吗?

编辑:这是 FetchUserDetailsAsync 的源代码:

    public async Task<JsonValue> FetchUserDetailsAsync(string url, string username, string password)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(url));
request.ContentType = "application/json";
request.Method = "GET";

string myBasicHeader = AuthenticationHelper.MakeHeader(username, password);

request.Headers.Add("Authorization", "Basic " + myBasicHeader);

try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (Stream stream = response.GetResponseStream())
{
JsonValue jsonDoc = await Task.Run(() => JsonObject.Load(stream));
return jsonDoc;
}
}
}
catch (WebException e)
{
Console.WriteLine(e.ToString());
if (e.Status == WebExceptionStatus.ProtocolError)
{
var response = e.Response as HttpWebResponse;
if (response != null)
{
Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
}
else
{
Console.WriteLine("No http status code available");
}
}
return null;
}
}

最佳答案

看起来 FetchUserDetailsAsync 或 ParseUserDetails 正在阻塞 UI 线程。因为 Task.Sleep(5000) 是同步运行的。尝试 await Task.Delay(5000);在 FetchUserDetailsAsync 行中查看进度条是否显示。如果是这样,那么您可能需要进入 FetchUserDetailsAsync 实现以确保它是异步实现的

关于c# - 使用 Xamarin 显示 Android ProgressBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38978965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com