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函数
我正在使用 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函数