我是否可以从获取使用await调用的数据(而非异步)的方法更改UI?

时间:2018-09-01 07:52:37

标签: xamarin xamarin.forms

我有此代码:

    protected override async void OnAppearing()
    {
        base.OnAppearing();            
        Subscribe();
        vm.IsBusy = true;
        if (Change.firstTimeCardsTab == true)
        {
            SetButtons(Settings.cc.ShortText());
            await Task.Run(() => GetOnAppearingData());
        }
    }

    private void GetOnAppearingData()
    {
        App.DB.GetData();
        AddDetailSection();
        SetPageDetails();
        Change.firstTimeCardsTab = false;
        vm.IsBusy = false;
    }

vm.IsBusy = true;在页面上显示活动指示器,并且vm.IsBusy = false;我希望将其关闭。

但是,当我运行代码时,我收到一条消息:

  

UIKit一致性错误:您正在调用的UIKit方法只能   从UI线程调用。

有人可以建议我如何设置活动指示器以显示,然后获取数据然后设置为不显示吗?注意AddDetailSection();向XAML添加一些元素。这可能是问题吗?

1 个答案:

答案 0 :(得分:1)

UI只能从主线程进行操作。有一种方法Device.BeginInvokeOnMainThread(Action)可以帮助解决您的问题,更多方法可以在official documentation中找到。

只需包装所有与UI相关的操作即可:
Device.BeginInvokeOnMainThread(() => { SetPageDetails(); // Any other actions });