2014-10-09 66 views
0

我正在嘗試獲取客戶數據以將它們解析爲客戶對象以在TableView上顯示。以下代碼有時可用,有時不適用。每當它崩潰時,即使我每次運行相同的代碼,它都會顯示客戶數據在foreach循環中爲空。我不知道在這種情況下可能會出現什麼問題。我在這個平臺上很新。如果我缺少任何/額外的信息,請告訴我。以Xamarin形式崩潰數據提取

namespace TableViewExample 
{ 
    public partial class MyDataServices : ContentPage 
    { 
     private ODataClient mODataClient; 
     private IEnumerable <IDictionary<string,object>> Customers; 

     public MyDataServices() 
     { 
      InitializeComponent(); 
      InitializeDataService(); 
      GetDataFromOdataService(); 

      TableView tableView = new TableView{ }; 
      var section = new TableSection ("Customer"); 

      foreach (var customers in Customers) { 
       //System.Diagnostics.Debug.WriteLine ((string)customers ["ContactName"]); 
       var name = (string)customers ["ContactName"]; 
       var cell = new TextCell{ Text = name }; 
       section.Add (cell); 
      } 
      tableView.Root.Add (section); 

      Padding = new Thickness (10, 20, 10, 10); 
      Content = new StackLayout() { 
       Children = { tableView } 

      }; 


     } 


     private void InitializeDataService(){ 

      try { 
       mODataClient = new ODataClient ("myURL is here"); 

      } 

      catch { 
       System.Diagnostics.Debug.WriteLine("ERROR!"); 

      } 
     } 

     private void GetDataFromOdataService(){ 

      try { 
       Customers = mODataClient.For ("Customers").FindEntries(); 
      } 

      catch { 
       System.Diagnostics.Debug.WriteLine("ERROR!"); 

      } 

     } 
    } 
} 
+1

它在哪裏崩潰?你得到的例外是什麼?你在運行什麼?你是否會崩潰模擬器?或者在設備上?哪個模擬器?哪個設備? – 2014-10-09 14:20:34

+0

它在模擬器上崩潰,我還沒有在設備上測試過。我只在模擬器中用iOS 8.0測試iPhone 5 – casillas 2014-10-09 14:24:32

+0

這表明客戶是空的。我試圖得到那個錯誤,但是運氣不好,即使我已經運行了這個應用程序將近30次,它仍然沒有出現。 – casillas 2014-10-09 14:30:23

回答

1

它很難幫助在這裏,但這裏有一些事情要考慮: -

這聽起來像DataService在既可以不接觸/離線;太忙或者它甚至可能自己拋出一個異常並返回一個你不希望接收到的數據響應,然後觸發一個異常並在應用程序中崩潰,因爲你總是期待一個確切的響應,而不需要迎合任何異常響應/事件。

如果您通過互聯網聯繫外部服務,它可能只是您的互聯網連接緩慢/有故障,並且沒有像其他可能性那樣快速返回信息。

在您的代碼中,您假設您始終得到服務器的響應 - 並且此響應將始終具有預期解碼的預期結構 - 而不考慮數據服務返回異常響應的可能性。我沒有使用過ODataClient個人,所以不知道它的行爲在DataService在的可能收到/超時沒有數據,或者你的情況的事件,以及如何在應對一個糟糕的請求等

內部行爲我假設會拋出一個異常,並且您確實會執行調試行來指示失敗。

您可能希望讓你寫出來的例外爲好,即也調整這一說法: -

private void GetDataFromOdataService() 
{ 
    try 
    { 
     Customers = mODataClient.For ("Customers").FindEntries(); 
    } 
    catch (Exception ex) 
    { 
     System.Diagnostics.Debug.WriteLine("ERROR!" + ex.ToString()); 
    } 
} 

如果有不好的反應,然後在Customers = .....行會拋出異常,因爲可能沒有客戶返回或其他信息打包在數據服務的響應中。

Customers變量也將是null在這一點上,我假設由於這個失敗。

所以,當你在foreach (var customers in Customers) {回到你的代碼,它就會拋出一個空引用異常作爲Customers是逸岸。由於所有當前的代碼都在構造函數中執行,並且沒有任何trycatch塊,所以它也會在此時崩潰您的應用程序。

此外,您正在構造函數中完成所有這些工作。嘗試分離出來。我還沒有調查構建函數在頁面生命週期中被調用的位置,但是,如果它位於viewDidLoad,那麼對於所有內容都要完成10秒,否則它將自動退出。我想你的情況,但這不適用。

今後也儘量把你的佈局控件在構造和移動數據的任務也許OnAppearing覆蓋來代替。

使用異步肯定是可取爲好,但請記住,你需要檢查從DataService的響應,因爲錯誤可以在響應中嵌入也,你將需要檢測時,它是OK到處理數據。

+0

非常感謝皮特。您的回覆非常好,內容非常豐富 – casillas 2014-10-09 17:08:04

+1

希望它能幫助您實現這一目標。如果你仍然有問題,數據服務在互聯網上,那麼可能發送整個項目,我會很快運行它來幫助?我的聯繫方式在我的個人資料上。 – Pete 2014-10-09 17:10:43

+0

一旦你有時間,請你看看下面的問題:http://stackoverflow.com/questions/26286524/rotating-label-with-databinding-xamarin – casillas 2014-10-09 19:33:41