我有一个应用程序,当从用户开始请求qr代码时,根据扫描的qr,活动中会加载一个不同的片段
我正在使用ZXing移动扫描仪来执行此操作
不幸的是,扫描仪在关闭之前返回一个回复方式并返回到调用活动
这意味着当我调用事务代码将当前片段替换为新片段时,活动尚未处于前台,因此没有任何反应
为了解决这个问题,我创建了一个ManualResetEvent(我正在使用一个Semaphore,当我必须将它转换为Android Studio时)我在开始扫描之前设置,然后在OnResume部分重置活性
这似乎可以解决问题,但感觉有更好的解决方案
我有什么遗失的吗?
提前感谢您提供的任何帮助
编辑:我目前正在使用的代码
public class MyActivity : Activity {
ManualResetEvent _has_resumed = new ManualResetEvent(false);
.....
protected override void OnResume() {
base.OnResume();
_has_resumed.Set();
}
......
void scan_qr(Action<string> finished_callback) {
#region initialize the scanner
MobileBarcodeScanner scanner = new MobileBarcodeScanner();
MobileBarcodeScanningOptions options = new MobileBarcodeScanningOptions();
options.UseNativeScanning = true; //use native scan
options.AutoRotate = false;//do not rotate the screen
options.PossibleFormats = new List<BarcodeFormat> { BarcodeFormat.QR_CODE }; // only allow qr_codes;
#endregion
#region perform the actual scan, when it finishes return to the main thread and execute the callback
_has_resumed.Reset();
scanner.Scan(this, options) //do scan
.ContinueWith(result => {
_has_resumed.WaitOne();
return result.Result;
})//wait until the activity has resumed
.ContinueWith((task_result) => { //then return the result
Result result = task_result.Result;
if (result == null) {
show_toast( Resource.String.questions_select_error_no_qr_scanned );
} else {
finished_callback(result.Text);
}
}, System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext());
#endregion
}
}