微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin 中 QR 扫描后的处理对话框

如何解决Xamarin 中 QR 扫描后的处理对话框

我在 Xamarin App 中使用 QR Code Scanner,当它扫描二维码时,它会执行一些操作,大约需要一分钟,在执行操作时,我想在屏幕上显示一个加载对话框。但是,它没有显示在屏幕上,在应用程序的其他地方,它运行良好。

代码

var expectedFormat = ZXing.BarcodeFormat.QR_CODE;
var opts = new ZXing.Mobile.MobileBarcodeScanningOptions { PossibleFormats = new List<ZXing.BarcodeFormat> { expectedFormat } };
var scanner = new ZXing.Mobile.MobileBarcodeScanner();
var result = await scanner.Scan(opts);
if (result == null)
{
    // code

    return null;
}
else
{
    using (UserDialogs.Instance.Loading("Processing"))
    {
        // code
    }
}

更新代码示例

public async Task Verification(object sender,EventArgs e)
{
    try
    {
        var expectedFormat = ZXing.BarcodeFormat.QR_CODE;
        var opts = new ZXing.Mobile.MobileBarcodeScanningOptions { PossibleFormats = new List<ZXing.BarcodeFormat> { expectedFormat } };
        var scanner = new ZXing.Mobile.MobileBarcodeScanner();
        var result = await scanner.Scan(opts);
        if (result == null)
        {
            // Code
            
            return null;
        }
        else
        {
            try
            {
                // QR Scan Result
                string qr_scan = result.Response;

                var result = JsonConvert.DeserializeObject<QRScan>(qr_scan);

                await CreateConnection();
            }
            catch (Exception error)
            { }
            finally
            {
                // navigate to next page
                await NavigationService.NavigatetoAsync<Nextviewmodel>();
            }
        }
    }
    catch (Exception error)
    { }

    return null;
}

public async Task CreateConnection()
{
    UserDialogs.Instance.Loading("Processing");
     
    if ()
    {
        try
        {
            // Code
        }
        catch (Exception error)
        {
            // Code
        }
        finally
        {
            await CreateFolder(default,default);
        }
    }
}

public async Task CreateFolder(object sender,EventArgs e)
{
    UserDialogs.Instance.Loading("Processing");

    try
    {
        // Code
    }
    catch (Exception error)
    {
        // Code
    }

    return null;
}  

解决方法

尝试这样的事情

Device.BeginInvokeOnMainThread(async () =>
{

    try
    {
        using (UserDialogs.Instance.Loading(("Processing")))
        {
            await Task.Delay(300);
                      
            //Your Service code
        }
    }
    catch (Exception ex)
    {
        var val = ex.Message;
        UserDialogs.Instance.Alert("Test",val.ToString(),"Ok");
    }
});
,

您可以使用 Xamarin.Essentials' MainThread 类,更具体地说 - InvokeOnMainThreadAsync 方法。此方法的想法不仅是在 UI/主线程上执行代码,而且还等待它的代码。这样你就可以同时拥有异步/等待逻辑和主线程执行。

try
{
    // QR Scan Result
    string qr_scan = result.Response;
    var result = JsonConvert.DeserializeObject<QRScan>(qr_scan);
    await MainThread.InvokeOnMainThreadAsync(() => CreateConnection());
}
catch (Exception error)
{ }
finally
{
    // navigate to next page
    await NavigationService.NavigateToAsync<NextViewModel>();
}

请记住,如果方法 CreateConnection 需要很长时间来执行,那么最好只在主线程上执行对话框演示文稿 (UserDialogs.Instance.Loading(""))。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。