2014-01-15 171 views
0

我在MonoForAndroid中有一個活動,它使用Zxing.Net.Mobile掃描Android上的條形碼。在掃描和返回結果方面,一切正常。但是,當我嘗試處理scanOverlay上的任何事件時,我收到nullReferenceException。我的代碼如下,任何幫助將不勝感激。從異步方法中處理事件

public async void StartScanSession(ScanSessionEventArgs e) 
{ 
     EnsureLoadingZxingOverlay(e); 
     EnsureStartingZxingBarcodeScanner();    
     var zxingOptions = MobileBarcodeScanningOptions.Default; 

     var result = await ZxingBarcodeScanner.Scan(zxingOptions); 
     HandleScanResult(result, e); 
} 

private void HandleScanResult(ZXing.Result result, ScanSessionEventArgs e) 
{ 
    if (result != null && e.OnFinishCallBack != null) 
    { 
     var scanResult = new ScanResult { ShouldStopScanning = false, BarcodeText = result.Text, ScanTime = result.Timestamp, BarcodeFormat = result.BarcodeFormat.ToString(), RawBytes = result.RawBytes }; 
     e.OnFinishCallBack(scanResult); 
    } 
} 

private void EnsureLoadingZxingOverlay(ScanSessionEventArgs e) 
{ 
    if (ZxingOverlay == null) 
    { 
     ZxingOverlay = LayoutInflater.FromContext(this).Inflate(Resource.Layout.scan_custom_layout, null); 
     ScanLayoutFlashButton = ZxingOverlay.FindViewById<Button>(Resource.Id.ScanLayoutFlashButton); 
     ScanLayoutDoneButton = ZxingOverlay.FindViewById<Button>(Resource.Id.ScanLayoutDoneButton); 

     UnhookZxingLayoutButtons(); 
     ScanLayoutFlashButton.Click += (sender, args) => ZxingBarcodeScanner.ToggleTorch(); 
     ScanLayoutDoneButton.Click += (sender, args) => HandleDoneButtonOnZxingScanLayout(e); 
    } 
} 

以上所有代碼工作正常。然而,當我試圖處理上的佈局完成按鈕,我得到的NullReferenceException下面

 
UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object 
at Leopard.Mobile.Screens.QVgaPortrait.MainScreen.HandleDoneButtonOnZxingScanLayout (Leopard.Mobile.Business.Event.ScanSessionEventArgs) [0x0001e] in ...\MainScreen.cs:178 
at Leopard.Mobile.Screens.QVgaPortrait.MainScreen/c__DisplayClass8.b__6 (object,System.EventArgs) [0x00000] in ...\MainScreen.cs:156 
at Android.Views.View/IOnClickListenerImplementor.OnClick (Android.Views.View) [0x0000d] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.10.1-branch/d23a19bf/source/monodroid/src/Mono.Android/platforms/android-14/src/generated/Android.Views.View.cs:1615 
at Android.Views.View/IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ (intptr,intptr,intptr) [0x00011] in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.10.1-branch/d23a19bf/source/monodroid/src/Mono.Android/platforms/android-14/src/generated/Android.Views.View.cs:1582 
at (wrapper dynamic-method) object.49957671-33c0-4b79-8c3b-36f419ebfaaa (intptr,intptr,intptr) 
+0

請張貼異常的詳細信息,包括堆棧跟蹤。 –

+0

謝謝Stephen,在上面添加了異常的詳細信息 –

回答

0

我找不到任何有關設置Zxing庫的方法和事件的問題。特別是在MonoTounch上做了相同的設置並且一切正常。因此,我進入源代碼,看看scanner.Cancel()方法在內部有什麼作用。我發現它只是調用ZxingActivity上的Cancel()static方法,所以我從我的代碼中完成了這項工作,並且所有工作都很順利。 這可能不是最優雅的解決方案,並且我在github上的Zxing.Net.Mobile回購(here)上報告了一個問題,但現在這個工作正常,我希望它可以幫助其他人。我也有一個完整的文章詳細介紹了我在MonoDroid上使用這個庫的經驗,以防有人需要它here。與此一致

ZxingBarcodeScanner.Cancel(); 

所以修復程序替換這條線(從上面的代碼)

ZxingActivity.RequestCancel(); 
0

異常的

private void HandleDoneButtonOnZxingScanLayout(ScanSessionEventArgs e) 
{ 
     var result = new ScanResult { ShouldStopScanning = true }; 
     if (e.OnFinishCallBack != null && ZxingBarcodeScanner != null) 
     { 
      // at this line below, ZxingBarcodeScanner is null, 
      // but I am sure I have initiated before wiring the event 
      // I am guessing it is something to do with the context of the async method?? 
      ZxingBarcodeScanner.Cancel(); 
      e.OnFinishCallBack(result); 
     } 
    } 

細節不能因缺乏信​​譽的所以在這裏發帖評論。

我們遇到了另一個第三方應用程序超出範圍的類似問題。你有沒有做過任何級別的線程安全檢查?也許你的ZxingBarcodeScanner只能通過創建它的線程來訪問,即調用「StartScanSession」的線程。

+0

事件處理程序與上面所見的線程相同 –