2016-04-19 37 views
0

我正在爲Xamarin和Zxing庫開發android代碼欄應用程序。 我的目標是在同一視圖中使用代碼欄視圖的一半屏幕,另一半使用按鈕將已掃描對象添加或刪除到列表中。Xamarin Zxing片段OnPause只有創建視圖層次結構的原始線程可以觸及其視圖

在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功能,誰調用在斑馬線片段的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函數給出異常的「創建視圖層次可以觸摸其觀點只有原來的線程」,但如果我忽略它一切隨機時間運作良好。我可以取代碼,相機消失,然後添加或刪除對象,再次調用相機,並且所有工作正常5 ... 10 ... 15次,直到我得到一個「未處理的異常: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得到檢測到最後的代碼的靜態圖像。

+1

你能解釋一下當你使用RuOnUiThread時會發生什麼嗎? – Sreeraj

+0

這個錯誤是一個Android操作系統的錯誤,你不能真正忽略它,沒有不好的事情在某個時候發生......正如@Sreeraj提到的,你可以提供更多關於使用'RunOnUiThread'的問題,因爲這是根的修復。 – SushiHangover

回答

0

在很多次嘗試後,我意識到我使用非託管崩潰作爲我的應用程序的正確行爲。

我所做的是不是調用Zxingfragment調用的OnResume和OnPause函數(誰有明確的目標)直接掃描函數和停止掃描函數。

相關問題