2014-10-09 53 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