【问题标题】:Xamarin Android Dismiss ProgressDialog in async functionXamarin Android 在异步函数中关闭 ProgressDialog
【发布时间】:2015-10-28 20:46:05
【问题描述】:

我有一个异步函数,我想在任务完成后关闭 ProgressDialog。我看到它是在 onPostExecute 方法中完成的,但是我没有异步类来实现它。就我而言,它是异步方法

    public async void ScanBarcode()
    {
        dialogIndicator.Show ();

        var zscanner = new MobileBarcodeScanner();
        //var result = await zscanner.Scan();

        var result = await zscanner.Scan ();

        HandleScanResult(result);


    }
    void HandleScanResult(ZXing.Result result)
    {
       dialogIndicator.Dismiss ();
    }

App 为 dialogIndicator.Dismiss (); 抛出异常。我明白了

  "Android.Util.AndroidRuntimeException: Only the original thread that created a view hierarchy can touch its views.

  at --- End of managed exception stack trace ---
  at android.view.ViewRootImpl$CalledFromWrongThreadException: Only    the original thread that created a view hierarchy can touch its views.
  at at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7155)
  at at android.view.ViewRootImpl.doDie(ViewRootImpl.java:6255)
  at at android.view.ViewRootImpl.die(ViewRootImpl.java:6240)
  at at    android.view.WindowManagerGlobal.removeViewLocked(WindowManagerGlobal.java:365)
  at at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:320)
  at at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:84)
  at at android.app.Dialog.dismissDialog(Dialog.java:420)
  at at android.app.Dialog$1.run(Dialog.java:128)
  at at android.os.Handler.handleCallback(Handler.java:733)
  at at android.os.Handler.dispatchMessage(Handler.java:95)
  at at android.os.Looper.loop(Looper.java:146)
  at at android.app.ActivityThread.main(ActivityThread.java:5731)
  at at java.lang.reflect.Method.invokeNative(Native Method)
  at at java.lang.reflect.Method.invoke(Method.java:515)
  at at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
  at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)

at at dalvik.system.NativeStart.main(Native Method)

在这种情况下如何关闭 ProgressDialog。

【问题讨论】:

    标签: android xamarin async-await progressdialog


    【解决方案1】:

    知道抛出什么类型的异常以查看发生了什么问题会很有用。

    我建议您更改代码中的某些内容。

    首先,将asyncvoid 返回类型一起使用不是最佳做法。因为这使得无法等待ScanBarcode 或从那里捕获任何异常。

    第二件事是你没有在HandleScanResult 内做任何在ScanBarcode 内不能做的事情。因此,我将其合并为以下内容:

    public async Task ScanBarcode()
    {
        dialogIndicator.Show ();
    
        var zscanner = new MobileBarcodeScanner();
        var result = await zscanner.Scan ();
    
        dialogIndicator.Dismiss ();
    }
    

    这样,代码“等待”扫描结果,然后继续关闭 dialogIndicator。

    如果您从 UI 线程以外的另一个线程调用 ScanBarcode,您可以像这样在 UI 线程上强制执行:

    public async Task ScanBarcode()
    {
        RunOnUiThread(()=>
        {
            dialogIndicator.Show ();
        });
    
        var zscanner = new MobileBarcodeScanner();
        var result = await zscanner.Scan ();
    
        RunOnUiThread(()=>
        {
            dialogIndicator.Dismiss ();
        });
    }
    

    【讨论】:

    • 我在 HandleScanResult 函数中有一些代码。只是我没有在这里发布。我得到的实际错误是“只有创建视图层次结构的原始线程才能触及它的视图。”
    • 我添加了代码以确保在 UI 线程上调用关闭和显示。
    猜你喜欢
    • 2015-05-12
    • 2020-12-26
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多