【问题标题】:Cannot display data from responsebody HttpClient get request无法显示来自 responsebody HttpClient 获取请求的数据
【发布时间】:2020-04-09 03:54:06
【问题描述】:

在我之前的帖子中,我询问了如何使用 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;

【问题讨论】:

  • 试着解释你在哪一行得到了错误。你到底想做什么。也看这里,stackoverflow.com/questions/5161951/… 似乎可能重复
  • 我在labelTxt.Text = result 收到错误消息。我正在尝试从响应体中传递其中一个值并让它显示在labelTxt.Text
  • 你只能从 UI 线程修改 UI 元素是相当普遍的做法,所以看起来你可能需要调用一个线程

标签: c# api xamarin.forms httpclient


【解决方案1】:

正如上面好奇的男孩所说,你只能从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;});

【讨论】:

    【解决方案2】:

    试试下面的方法(假设整个事情是一个名为“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;
     });
    }
    

    【讨论】:

    • 嗨,他们提示我在里面添加异步,所以我改用Device.BeginInvokeOnMainThread(async () =>,但它仍然不起作用..
    【解决方案3】:

    嗨,请试试这个代码。

    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 = await APIService.GetResultAsync>($"{ApiEndpoints}/{"Paramters1"}/{pageNo}");

    【讨论】:

    • 如何传入我的 Get 请求正文?是结果吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多