Xamarin Zxing Fragment OnPause 只有创建视图层次结构的原始线程才能接触其视图

Xamarin Zxing Fragment OnPause Only the original thread that created a view hierarchy can touch its views

我正在使用 Xamarin 和 Zxing 库为 android 开发代码栏应用程序。 我的 objective 是让屏幕的一半与代码栏视图在同一视图中,另一半与用于将扫描对象添加到列表或从列表中删除的按钮。

在 MainActivity OnCreate 函数中我有:

        scanFragment = new ZXingScannerFragment();
        FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();
        fragmentTx.Replace(Resource.Id.fragment, scanFragment);
        fragmentTx.SetTransition(FragmentTransit.FragmentFade);
        fragmentTx.Commit();

在 ZXingScannerFragment OnCreate 我有

        frame = (FrameLayout)layoutInflater.Inflate(Resource.Layout.zxingscannerfragmentlayout, viewGroup, false);
        return frame;

我想要的是,当用户扫描某些东西时,相机的视图会关闭,然后当用户决定是要保留还是丢弃扫描的对象时,相机会再次显示。

所以当在 MainActivity 上检测到代码时,我调用了一个 scann 函数,它调用 Zxing 片段中的 OnPause 方法并使用以下代码启用按钮:

            var opts = new MobileBarcodeScanningOptions {
                PossibleFormats = new List<ZXing.BarcodeFormat> {
                ZXing.BarcodeFormat.All_1D,
            }
            };
            scanFragment.StartScanning(result => {

                if (result == null || string.IsNullOrEmpty(result.Text)) {
                    Toast.MakeText(this, "Scanning Cancelled", ToastLength.Long).Show();
                    return;
                }
                else
                {
                    _player.Start();
                    RunOnUiThread(() => codBox.Text = result.Text);
                    RunOnUiThread(() => addBut.Enabled = true);
                    RunOnUiThread(() => delBut.Enabled = true);
                    RunOnUiThread(() => masBut.Enabled = true);
                    RunOnUiThread(() => menBut.Enabled = true);
                    RunOnUiThread(() => buttonDate.Enabled = true);
                    RunOnUiThread(() => finishBut.Enabled = false);
                    scanFragment.OnPause();
                }
            }, opts);

然后我有另一个函数从 Zxing 片段调用 OnResume。

OnPause 函数如下所示:

      base.OnPause ();
      if (scanner != null)
      {
           frame.RemoveView(scanner);
           if (!UseCustomOverlayView)
                frame.RemoveView(zxingOverlay);
           else if (CustomOverlayView != null)
                frame.RemoveView(CustomOverlayView);
           scanner.ShutdownCamera();
           scanner = null;
        }

问题是: 使用此代码,OnPause 函数会给出 "Only the original thread that created a view hierarchy can touch its views" 异常,但如果我忽略它,则在某个随机时间一切正常。我可以获取代码,相机消失,然后添加或删除对象,然后再次调用相机,一切正常,连续 5 次...10...15 次,直到我得到一个没有想法的 "Unhandled Exception: Java.Lang.NullPointerException" 是被解雇,没有更多信息。

如果我做一些事情来防止层次结构异常,例如:

            if (scanner != null)
            {
                var myActivity = (MainActivity)this.Activity;
                myActivity.RunOnUiThread(() =>
                {
                    frame.RemoveView(scanner);
                    if (!UseCustomOverlayView)
                        frame.RemoveView(zxingOverlay);
                    else if (CustomOverlayView != null)
                        frame.RemoveView(CustomOverlayView);
                });
                scanner.ShutdownCamera();
                scanner = null;
            }

摄像头消失,没有抛出异常,但是当我调用 OnResume 时,我得到了检测到的最后代码的静态图像。

最后,经过多次尝试,我意识到我正在使用非托管崩溃作为我的应用程序的正确行为。

我做的是不调用Zxingfragment的OnResume和OnPause函数(目标明确)直接调用scan函数和stopscanning函数