在我之前的文章中,我询问了如何使用 C# 中的主体从 Http Get Request 获取数据。现在我面临另一个错误:
Android.Util.AndroidRuntimeException:“只有创建视图层次结构的原始线程才能触摸其视图。”
有谁知道如何解决这个问题吗?
代码
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("my url"),
Content = new StringContent("my json body content", Encoding.UTF8, "application/json"),
};
var response = await client.SendAsync(request).ConfigureAwait(false);
response.EnsureSuccessStatusCode();
var responsebody = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
string text = responsebody.ToString();
string[] str = text.Split(new[] { ',', ':' }, StringSplitOptions.RemoveEmptyEntries);
string result = str[10];
labelTxt.Text = result;
正如好奇男孩上面所说,你只能从 UI 线程(主线程)修改 UI 元素。
所以你可以尝试将
labelTxt.Text = result;
放入 Device.BeginInvokeOnMainThread
方法中。
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("my url"),
Content = new StringContent("my json body content", Encoding.UTF8, "application/json"),
};
var response = await client.SendAsync(request).ConfigureAwait(false);
response.EnsureSuccessStatusCode();
var responsebody = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
string text = responsebody.ToString();
string[] str = text.Split(new[] { ',', ':' }, StringSplitOptions.RemoveEmptyEntries);
string result = str[10];
Device.BeginInvokeOnMainThread(() => {labelTxt.Text = result;});
尝试如下所示(假设这整个事情是一个名为“
SomeFunction
”的函数)
private void SomeFunction() {
Device.BeginInvokeOnMainThread(() => {
var client = new HttpClient();
var request = new HttpRequestMessage {
Method = HttpMethod.Get,
RequestUri = new Uri("my url"),
Content = new StringContent("my json body content", Encoding.UTF8, "application/json"),
};
var response = await client.SendAsync(request).ConfigureAwait(false);
response.EnsureSuccessStatusCode();
var responsebody = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
string text = responsebody.ToString();
string[] str = text.Split(new [] {
',',
':'
}, StringSplitOptions.RemoveEmptyEntries);
string result = str[10];
labelTxt.Text = result;
});
}
您好,请尝试此代码。
public async static Task<T> GetResultAsync<T>(string Url)
{
try
{
if (CrossConnectivity.Current.IsConnected)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(BaseUrl);
client.DefaultRequestHeaders.Clear();
client.SetBearerToken(Helpers.Settings.ServiceToken);
client.DefaultRequestHeaders.Add("Language", Helpers.Settings.AppLanuageSetting);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.GetAsync($"{Url}").ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
var result = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(result,new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.None });
}
else
{
return default(T);
}
}
}
else
{
Acr.UserDialogs.UserDialogs.Instance.Toast("Please check your internet connection");
return default(T);
}
}
catch (Exception Ex)
{
Logging.ErrorLog(Ex, "GetResultAsync");
return default(T);
}
}
并使用这个方法
var 结果 = 等待 APIService.GetResultAsync>($"{ApiEndpoints}/{"Paramters1"}/{pageNo}");