调用ZXing qr扫描仪后如何等待android活动完全恢复

时间:2016-12-07 13:05:00

标签: xamarin zxing

我有一个应用程序,当从用户开始请求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
    }



}

0 个答案:

没有答案