无法显示响应体HttpClient获取请求中的数据



在我上一篇文章中,我询问了从C#中的Http Get-Request获取数据的问题。现在我面临另一个错误,Android.Util.AndroidRuntimeException: 'Only the original thread that created a view hierarchy can touch its views.'有人知道如何解决这个问题吗?

代码

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;

正如curiousBoy上面所说,您只能从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 results=wait APIService.GetResultAsync>($"{ApiEndpoints}/{"Paramters1"}/{pageNo}"(;

最新更新