【问题标题】:DisplayAlert causing crash of Xamarin appDisplayAlert 导致 Xamarin 应用程序崩溃
【发布时间】:2019-10-18 00:04:46
【问题描述】:

我正在使用显示警报进行简单的是或否对话,但它冻结了我的 UI,我不知道为什么。

private  async void BtnDeleteStockTake_Clicked(object sender, EventArgs e)
{

        var selectedItem = gridItems.SelectedItem as StockTakeTransArgsSage;
        var action =  await DisplayAlert("First 1", "Are you sure you wish to delete Stock Take", "Yes", "No");
        if (action)
        {
            StockTakeTransArgsSage _item = new StockTakeTransArgsSage();
           _item =database.GetSingleStockTake(selectedItem.StockTakeId).Result;
           _item.Quantity = decimal.Parse(txtQty.Text);

            int updated = await database.DeleteStockTake(_item);
            await DisplayAlert("Second 1", "Stock Take Deleted", "OK");          
            await RebindData();
        }
}

奇怪的事情,以及第一个的显示警报,不要关闭

这会导致 UI 因致命错误而崩溃,但是如果我在没有显示警报的情况下正常单步执行我的代码,它会显示警报但随后会冻结。

我的删除股票功能

public async Task<int> DeleteStockTake(StockTakeTransArgsSage args)
{
   return await database.DeleteAsync(args);


}

我的 Get Single 函数。

public async Task<StockTakeTransArgsSage> GetSingleStockTake(int ID)
{
        StockTakeTransArgsSage _stocktake = new StockTakeTransArgsSage();          
        _stocktake = await database.Table<StockTakeTransArgsSage>().Where(w => w.StockTakeId == ID).FirstOrDefaultAsync();       
        return _stocktake;

}

【问题讨论】:

  • 你为什么要回答有公认答案的东西
  • 我只是重新审视它,我有一种感觉,如果你这样做它可能会工作: var action = await App.Current.MainPage.DisplayAlert("First 1", "Are you sure you wish删除 Stock Take", "Yes", "No");
  • 当时在 xamrain 表单中这是一个已知错误,已修复 noq 我得到它与下面的解决方案一起使用

标签: xamarin xamarin.forms


【解决方案1】:

很可能从您描述的行为(并查看您的代码)来看,这听起来像是因为显示警报未在 UI 线程上运行,这导致应用程序等待您关闭此警报框在能够做任何事情之前。所以你的应用程序没有崩溃或冻结,它只是在不同的线程上启动警报。 所以改成下面这样:

Device.BeginInvokeOnMainThread(() =>
{
            DisplayAlert("Second 1", "Stock Take Deleted", "OK");          
});

让我知道这是否有意义。

【讨论】:

    【解决方案2】:

    在您的代码中,只有这些行会导致该行为:

           StockTakeTransArgsSage _item = new StockTakeTransArgsSage();
           _item =database.GetSingleStockTake(selectedItem.StockTakeId).Result;
           _item.Quantity = decimal.Parse(txtQty.Text);
    
            int updated = await database.DeleteStockTake(_item);
    

    如果不将其冻结一段时间,则无法在 UI 线程上执行这些行。这可能会导致崩溃,您没有提供任何关于您在输出中看到的崩溃信息,因此这是唯一可能的解释。

    【讨论】:

      【解决方案3】:

      你有没有试过像下面这样等待

      StockTakeTransArgsSage _item = new StockTakeTransArgsSage();
                 _item = await database.GetSingleStockTake(selectedItem.StockTakeId);
                 _item.Quantity = decimal.Parse(txtQty.Text);
      

      正如我所见,这会奏效。还要确保在完成该过程之前,您不会触摸屏幕中的任何其他 UI 组件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-03
        • 2017-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-21
        • 2016-06-04
        相关资源
        最近更新 更多