等待HTTP响应时Android UI冻结

时间:2018-10-17 21:38:03

标签: c# android http xamarin

当我通过我的应用程序发送http请求时,我的应用程序UI在等待http响应时冻结。

为什么会这样?

async void HttpAction()
    {
        var request = HttpWebRequest.Create(url);
        request.Method = "GET";
        request.Timeout = 1500;

        await Task.Delay(500);

        using (HttpWebResponse reponse = request.GetResponse() as HttpWebResponse)
            {

                if (reponse.StatusCode == HttpStatusCode.OK)
                {
                    //UI action
                    reponse.Close();
                }
    }

非常感谢!

2 个答案:

答案 0 :(得分:1)

您需要在调用点等待HttpAction方法。首先阅读此Async/Await article,以更好地理解异步编程。

“异步任务”内部不应有任何UI操作,而应将结果返回到调用点,然后执行必要的操作。

async Task<bool> GetHttpAsyncStatus()
{
    var request = HttpWebRequest.Create(url);
    request.Method = "GET";
    request.Timeout = 1500;

    using (HttpWebResponse reponse = await request.GetResponseAsync() as HttpWebResponse)
    {
        if (reponse.StatusCode == HttpStatusCode.OK)
        {
            // no UI Action, just return the result
            reponse.Close();
            return true;
        }
        return false;
     }
}

此调用必须为

bool requestStatus = await GetHttpAsyncStatus();

答案 1 :(得分:0)

您需要使用AsyncTask并在doInBackground方法中运行http调用。 在onPostExecute方法中,您将更新ui。 AsyncTask不会非常麻烦,它将释放ui线程。我在异步方面没有太多经验,但是AsyncTask和HttpurlConnection从未使我在更棘手的问题上失败。