为什么当我单击按钮时,活动指示器需要近 3 秒才能启动



我在单独的xaml文件中ActivityIndicator了。我在主页xaml中将其用作自定义加载器。此自定义加载程序可见性由bool变量控制VisibleLoader

<custom:CustomLoader IsVisible="{Binding VisibleLoader}" 
AbsoluteLayout.LayoutBounds="0.5,0.5,1,1" 
AbsoluteLayout.LayoutFlags="All" Grid.Row="2">
</custom:CustomLoader>

MainPageViewModel当我单击按钮说明ActivityIndicator需要时间才能开始时。请参阅下面的代码

MainPageViewModel代码

private bool _visibleLoader = false;
public MainPageViewModel()
{
VisibleLoader = true;
current = this;
GetAllProducts();
SyncCommand = new Command(SyncDevice);
}
public bool VisibleLoader
{
get
{
return _visibleLoader;
}
set
{
this._visibleLoader = value;
NotifyPropertyChanged("VisibleLoader");
}
}

按钮单击事件代码

public async void SyncDevice()
{
try
{
VisibleLoader = true;
IsBusy = true;
PageMessage = string.Empty;
var strSerialNumber = DependencyService.Get<IDataHelper>().GetIdentifier();
//VisibleButtons = true;
resourceService = new ResourceService(new RequestProvider());
if (GlobalSettings.deviceId == 0)
{
DeviceDetails deviceDtls = await resourceService.GetDeviceDetails(strSerialNumber);
GlobalSettings.deviceId = deviceDtls.Id.Value;
}
if (GlobalSettings.deviceId.ToString() != null)
{
DevicesList data = await resourceService.GetProducts(GlobalSettings.deviceId);
//this.lstProducts = data.Devices[0].Products;
this.lstProducts = data != null ? data.Devices[0].Products : null;
if (lstProducts != null && lstProducts.Count != 0)
{
//Filter Products from Parameter file
var filterProducts = GlobalSettings.GetFilterProducts();
if (filterProducts.Count > 0)
{
//lstProducts = lstProducts.Where(product => !filterProducts.Any(fp => product.Name.ToLowerInvariant().Contains(fp.ToLowerInvariant()))).ToList();
lstProducts = lstProducts.Where(product => filterProducts.Any(fp => product.Name.ToLowerInvariant().Contains(fp.ToLowerInvariant()))).ToList();
}
TotalProducts = lstProducts.Count;
lstProducts = lstProducts.OrderBy(s => s.Order).ThenBy(s => s.Name).ToList();
}
else
{
PageMessage = "No products found.";
}
}
else
{
PageMessage = "Error occured. Please try again later.!";
}
NotifyPropertyChanged("lstProducts");
resourceService = new ResourceService(new RequestProvider());
await resourceService.SyncDevice(GlobalSettings.deviceId);
}
catch (Exception)
{
VisibleLoader = false;
}
VisibleLoader = false;
IsBusy = false;
}
}

xaml 文件中的按钮

<Button Text="Sync device" Command="{Binding SyncCommand}" HorizontalOptions="FillAndExpand"
BackgroundColor="LightBlue"  Margin="5" TextColor="White" BorderRadius="10" HeightRequest="40"></Button>

如何解决此问题?

首先,如果您的同步设备方法不是事件,我建议您将其作为任务,因为异步空隙不是一种好的做法。

public async Task SyncDevice()

此外,可能是您的布尔值在主线程中没有更改,这反过来又导致了这种情况,因此请尝试类似

Device.BeginInvokeOnMainThread(()=>{ //Change visibility... });

确保只在此处添加相关代码,因为这会阻塞主线程,进而使 UI 冻结

更新

然后,您的命令将如下所示:

new Command(async ()=>{await SyncDevice()});

最新更新