【问题标题】:Activity indicator not loading correctly活动指示器未正确加载
【发布时间】:2017-11-23 17:16:05
【问题描述】:

当代码消失并调用 azure 时,我正在使用活动指示器向用户显示。 调用本身工作正常,一切正常,但活动指示器加载一段时间后,我试图阻止用户的相同延迟仍然发生,然后下一个屏幕加载。 我可能应该澄清一下,我对 Xamarin 比较陌生,而且很多这种 async/await 的东西都暗示了我。 我已将 API 调用放入 Task 中,并在其中放置了一个名为 sleep 的等待方法,该方法运行大约 4 秒。这是我可以让它运行活动指示器的唯一方法。但看起来这也是导致问题的原因,所以总结一下我被卡住了。 我希望在活动指示器运行时调用 Azure,然后在它们返回打开下一页时进行,以防止页面滞后和冻结。它看起来不太好。 所以,这是调用 API 的方法:

private async Task HandleSubmitCommand()
{
        //if (IsLoading) return;
        IsLoading = true;

        await Sleep();

            if (!string.IsNullOrEmpty(IdentityDriver))
            {

                _entryFieldType = "oid";
                _statusResponse = DependencyService.Get<IWebService>().Login(_entryFieldType, IdentityDriver, App.TenantId.Value.ToString());
                IsLoading = false;
            }
            else
            {
                _entryFieldType = "rid";
                _statusResponse = DependencyService.Get<IWebService>().Login(_entryFieldType, IdentityRoute, App.TenantId.Value.ToString());
            }


        if (_statusResponse == "True")
        {
            Application.Current.MainPage = new DriverDashboardView();

        }
        else
            Application.Current.MainPage = new NotFoundView();

}

这是睡眠方法:

    private Task Sleep()
    {
        return Task.Delay(4000);
    }

这是调用 API 的 Login 方法:

public string Login(string ID, string IDPayload, string TenantID)
    {
        //await Sleep();
        var BaseURL = App.ConFigURL;
        var URI = string.Format(BaseURL, TenantID);

        using (var httpClient = new HttpClient(new HttpClientHandler()))
        {
            httpClient.BaseAddress = new Uri(URI);

            var Telemetry = new { typeid = ID , id = IDPayload};
            var Payload = JsonConvert.SerializeObject(Telemetry);
            var SAS = DependencyService.Get<ISasToken>().CreateToken(URI, "RootManageSharedAccessKey", "#####################################");

            httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", SAS);
            var Content = new StringContent(Payload, Encoding.UTF8, "application/json");


            var Response = httpClient.PostAsync(URI,Content).Result;

            return Response.IsSuccessStatusCode.ToString();

        }
    }

正如我所说,对 Azure 的调用很好,但它似乎并没有异步运行。我对 async/await 一点也不满意,这于事无补。 一个想法?

【问题讨论】:

    标签: c# azure asynchronous xamarin xamarin.forms


    【解决方案1】:

    我希望在活动指示器运行时调用 Azure,然后在它们返回时打开下一页,以防止页面滞后和冻结。

    您的HandleSubmitCommand 方法下的await Sleep(); 是不必要的。此时,您的登录操作将在 4s 后执行。根据您的 Login方法,通过httpClient.PostAsync(URI,Content).Result同步执行登录操作。您可以按如下方式修改您的方法:

    public async Task<bool> Login(string ID, string IDPayload, string TenantID)
    {
       .
       .
       var Response = await httpClient.PostAsync(URI,Content);
       return Response.IsSuccessStatusCode;
    }
    
    private async Task HandleSubmitCommand()
    {
       IsBusy = true;
       //call the login operation asynchronously
       _statusResponse = await DependencyService.Get<IWebService>().Login(_entryFieldType, IdentityDriver, App.TenantId.Value.ToString());
       IsBusy = false;
    }
    

    注意:您需要将IWebService 接口的定义更改如下:

    public interface IWebService
    {
       Task<bool> Login(string ID, string IDPayload, string TenantID);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 2012-01-25
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多