2012-05-31 40 views
2

我摆弄MonoDroid(又名Mono for Android)试图建立一个简单的播客下载应用程序,目前只是测试RSS提要内容的检索。MonoDroid ObjectDisposedException当加载XDocument的RSS

我简单的应用程序是:

  • 编辑文本,其中一个RSS源的URL输入
  • 一个按钮,“下载”的RSS
  • 为下载的输出文本显示操作

当用户点击下载,我获取RSS内容,目前使用XDocument(我也试图与just WebRequest/Streams etc.),这里的短版本:

void button_Click(object sender, EventArgs e) 
{ 
    output.Text += "user input: " + rssUriInput.Text + "\n"; 

    try 
    { 
     output.Text += "### document ###"; 
     output.Text += XDocument.Load(rssUriInput.Text).ToString(); 
     output.Text += "### document ###"; 
    } 
    catch (Exception ex) 
    { 
     output.Text += "OOOPS something went wrong:\n" + ex.ToString(); 
    } 
} 

我试过多种方法,但不断收到ObjectDisposedException时候我做XDocument.Load(/*my uri here*/);

我的AssemblyInfo.cs包括在

[assembly: UsesPermission(Android.Manifest.Permission.Internet)] 

现在,免责声明,让后的Hello World运行我有点自己的,所以我可能会缺少一些MonoDroid基础,但这个代码在一个正常的C#应用​​程序(我测试它)工作,但
为什么我在这里做错了?我是否必须在MonoDroid中使用xml/linq/network访问做一些特殊的事情?

这里是完整的活动代码:

using System; 

using Android.App; 
using Android.Content; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.OS; 
using System.Xml.Linq; 

namespace RssDownlowd 
{ 
    [Activity(Label = "RssDownlowd", MainLauncher = true, Icon = "@drawable/icon")] 
    public class Activity1 : Activity 
    { 
     EditText rssUriInput; 
     Button button; 
     TextView output; 

     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      SetContentView(Resource.Layout.RssDownload); 

      rssUriInput = FindViewById<EditText>(Resource.Id.rssUriText); 
      button = FindViewById<Button>(Resource.Id.downloadButton); 
      output = FindViewById<TextView>(Resource.Id.outputTextView); 

      button.Click += new EventHandler(button_Click); 
     } 

     void button_Click(object sender, EventArgs e) 
     { 
      output.Text += "user input: " + rssUriInput.Text + "\n"; 

      try 
      { 
       output.Text += "### document ###"; 
       output.Text += XDocument.Load(rssUriInput.Text).ToString(); 
       output.Text += "### document ###"; 
      } 
      catch (Exception ex) 
      { 
       output.Text += "OOOPS something went wrong:\n" + ex.ToString(); 
      } 
     } 

    } 
} 

这里是完全不同:

"System.ObjectDisposedException: The object was used after being disposed. 

    at System.Net.WebConnection.BeginRead (System.Net.HttpWebRequest request, System.Byte[] buffer, Int32 offset, Int32 size, System.AsyncCallback cb, System.Object state) [0x00000] in <filename unknown>:0 

    at System.Net.WebConnectionStream.BeginRead (System.Byte[] buffer, Int32 offset, Int32 size, System.AsyncCallback cb, System.Object state) [0x00000] in <filename unknown>:0 

    at System.Net.WebConnectionStream.Read (System.Byte[] buffer, Int32 offset, Int32 size) [0x00000] in <filename unknown>:0 

    at System.Xml.XmlInputStream.Read (System.Byte[] buffer, Int32 offset, Int32 count) [0x00000] in <filename unknown>:0 

    at System.Xml.NonBlockingStreamReader.ReadBuffer() [0x00000] in <filename unknown>:0 

    at System.Xml.NonBlockingStreamReader.Read (System.Char[] dest_buffer, Int32 index, Int32 count) [0x00000] in <filename unknown>:0 

    at System.Xml.XmlStreamReader.Read (System.Char[] dest_buffer, Int32 index, Int32 count) [0x00000] in <filename unknown>:0 

    at Mono.Xml2.XmlTextReader.ReadTextReader (Int32 remained) [0x00000] in <filename unknown>:0 

    at Mono.Xml2.XmlTextReader.PeekChar() [0x00000] in <filename unknown>:0 

    at Mono.Xml2.XmlTextReader.ReadChar() [0x00000] in <filename unknown>:0 

    at Mono.Xml2.XmlTextReader.Expect (Int32 expected) [0x00000] in <filename unknown>:0 

    at Mono.Xml2.XmlTextReader.ReadEntityReference (Boolean ignoreEntityReferences) [0x00000] in <filename unknown>:0 

    at Mono.Xml2.XmlTextReader.ReadReference (Boolean ignoreEntityReferences) [0x00000] in <filename unknown>:0 

    at Mono.Xml2.XmlTextReader.ReadText (Boolean notWhitespace) [0x00000] in <filename unknown>:0 

    at Mono.Xml2.XmlTextReader.ReadContent() [0x00000] in <filename unknown>:0 

    at Mono.Xml2.XmlTextReader.Read() [0x00000] in <filename unknown>:0 

    at System.Xml.XmlTextReader.Read() [0x00000] in <filename unknown>:0 

    at Mono.Xml.XmlFilterReader.Read() [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XElement.LoadCore (System.Xml.XmlReader r, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XNode.ReadFrom (System.Xml.XmlReader r, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XContainer.ReadContentFrom (System.Xml.XmlReader reader, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XElement.LoadCore (System.Xml.XmlReader r, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XNode.ReadFrom (System.Xml.XmlReader r, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XContainer.ReadContentFrom (System.Xml.XmlReader reader, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XElement.LoadCore (System.Xml.XmlReader r, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XNode.ReadFrom (System.Xml.XmlReader r, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XContainer.ReadContentFrom (System.Xml.XmlReader reader, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XElement.LoadCore (System.Xml.XmlReader r, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XNode.ReadFrom (System.Xml.XmlReader r, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XContainer.ReadContentFrom (System.Xml.XmlReader reader, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XDocument.ReadContent (System.Xml.XmlReader reader, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XDocument.LoadCore (System.Xml.XmlReader reader, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XDocument.Load (System.String uri, LoadOptions options) [0x00000] in <filename unknown>:0 

    at System.Xml.Linq.XDocument.Load (System.String uri) [0x00000] in <filename unknown>:0 

    at RssDownlowd.Activity1.button_Click (System.Object sender, System.EventArgs e) [0x0004a] in C:\\Users\\khd483\\code\\HelloMonoDroid\\RssDownlowd\\Activity1.cs:47 " 

回答

1

当我想你的代码,奇怪的是它的工作就好了:

Screen shot

你是否启用链接我n你的项目在Mono for Android选项中?

还要考虑做一个异步下载的RSS,因为它会阻止UI线程,直到它完成,使应用程序无响应。

+0

哇,很好!它似乎**链接是失踪的一块!** THANX我也同意异步下载,但现在我只是原型。是什么让你想到我连接?也许你可以链接(没有双关语意图)相关的东西... – TJB

+1

ObjectDisposedException让我想起它。邮件列表中的人员发生过这种情况。由于您不直接将XDocument.Load()结果保存到字段,因此链接器可能会将其删除,因为它将其视为未被使用。所以如果你这样做了:XDocument document = XDocument.Load(rssUriInput.Text);然后只是将document.ToString()转储到TextView中,它可能会启用链接。这里有一些关于它如何工作的更多信息:http://docs.xamarin.com/android/advanced_topics/linking#linkskip – Cheesebaron

+0

另外,似乎feedburner链接(出于某种原因)也会调用一个'ObjectDisposedException'我不确定是否因为一些奇怪的重定向等原因这正在发生,或者有关android网络堆栈的一些奇怪事情,但是它将我抛出了B/C,你的网址会起作用,而我的测试不会。再次感谢@ Cheesebaron – TJB