阅读RSS订阅源,数据结束前的阅读器结束
我使用Java为Android设备编写此代码。我只想读取RSS提要中的所有数据,然后准备好解析器来处理数据。我遇到的麻烦是只有一小部分数据被我的代码读取。然后它表示已到达阅读器的末尾,并继续将部分数据返回给解析器。阅读RSS订阅源,数据结束前的阅读器结束
我的代码是这样的:
try
{
URL contentUrl = new URL(url);
URLConnection conn = contentUrl.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
if(httpConn.getResponseCode() == HttpURLConnection.HTTP_OK)
{
InputStreamReader inStr = new InputStreamReader(httpConn.getInputStream());
int charsRead;
char[] buff = new char[BUFFER_SIZE];
String data = "";
while((charsRead = inStr.read(buff,0,BUFFER_SIZE))!= -1)
{
data += String.copyValueOf(buff, 0, charsRead);
buff = new char[BUFFER_SIZE];
}
Log.d("Http","Data: "+data.);
return data;
}
else
{
return null;
}
}
catch(IOException e)
{
return null;
}
的调试日志输出看起来是这样的:
> D/dalvikvm(19134): GC_FOR_MALLOC freed 24 objects/757272 bytes in 27ms
D/dalvikvm(19134): GC_FOR_MALLOC freed 2 objects/48 bytes in 26ms
D/dalvikvm(19134): GC_FOR_MALLOC freed 3 objects/301112 bytes in 29ms
I/dalvikvm-heap(19134): Grow heap (frag case) to 3.677MB for 305028-byte allocation
D/dalvikvm(19134): GC_FOR_MALLOC freed 0 objects/0 bytes in 37ms
D/dalvikvm(19134): GC_FOR_MALLOC freed 10 objects/760856 bytes in 27ms
D/dalvikvm(19134): GC_FOR_MALLOC freed 3 objects/305112 bytes in 26ms
D/dalvikvm(19134): GC_FOR_MALLOC freed 10 objects/770856 bytes in 26ms
D/dalvikvm(19134): GC_FOR_MALLOC freed 2 objects/48 bytes in 26ms
D/dalvikvm(19134): GC_FOR_MALLOC freed 3 objects/309112 bytes in 27ms
D/dalvikvm(19134): GC_FOR_MALLOC freed 22 objects/777648 bytes in 27ms
D/dalvikvm(19134): GC_FOR_MALLOC freed 2 objects/48 bytes in 30ms
D/dalvikvm(19134): GC_FOR_MALLOC freed 3 objects/309288 bytes in 26ms
D/dalvikvm(19134): GC_FOR_MALLOC freed 27 objects/778696 bytes in 27ms
D/Http (19134): Data: <?xml version="1.0" encoding="UTF-8"?>
D/Http (19134): <?xml-stylesheet type="text/xsl" media="screen" href="/~d/sty
les/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http:
//feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.or
g/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:geors
s="http://www.georss.org/georss" xmlns:thr="http://purl.org/syndication/thread/1
.0" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssname
space.org/feedburner/ext/1.0" gd:etag="W/"CUcFSHc7fip7ImA9Wx5UFk8.""><
id>tag:blogger.com,1999:blog-11300808</id><updated>2010-10-20T18:03:39.906-07:00
</updated><title type="text">Google Code Blog</title><subtitle type="html">Updat
es from Google's open source projects.</subtitle><link rel="http://schemas.googl
e.com/g/2005#feed" type="application/atom+xml" href="http://googlecode.blogspot.
com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://g
ooglecode.blogspot.com/" /><link rel="next" type="application/atom+xml" href="ht
tp://www.blogger.com/feeds/11300808/posts/default?start-index=26&max-results
=25&redirect=false&v=2" /><author><name>Chris DiBona</name><email>norepl
[email protected]</email></author><generator version="7.00" uri="http://www.blogger.
com">Blogger</generator><openSearch:totalResults>753</openSearch:totalResults><o
penSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openS
earch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="
self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/Dcn
i" /><feedburner:info uri="blogspot/dcni" /><atom10:link xmlns:atom10="http://ww
w.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry g
d:etag="W/"CUcFSHc6fCp7ImA9Wx5UFk8.""><id>tag:blogger.com,1999:blog-11
300808.post-3825033765857847156</id><published>2010-10-20T18:03:00.000-07:00</pu
blished><updated>2010-10-20T18:03:39.914-07:00</updated><app:edited xmlns:app="h
ttp://www.w3.org/2007/app">2010-10-20T18:03:39.914-07:00</app:edited><category s
cheme="http://www.blogger.com/atom/ns#" term="speed tracer" /><category scheme="
http://www.blogger.com/atom/ns#" term="gwt" /><category scheme="http://www.blogg
er.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/
ns#" term="cloud portability" /><title>Advancing cloud computing with integrated
developer tools by Google and VMware</title><content type="html"><p><i
>Cross-posted from the <a href="http://googlewebtoolkit.blogspot.com/">
Google Web Toolkit Blog</a></i></p>
D/Http (19134):
D/Http (19134): <p>
D/Http (19134): Earlier this year at Google I/O, we <a href="http://google
code.blogspot.com/2010/05/enabling-cloud-portability-with-google.html">announ
ced</a> a collaboration between <a href="http://www.google.com">Goog
le</a> and <a href="http://www.vmware.com">VMware</a> focused
on making it easy to build business-oriented, <a href="http://code.google.com
/cloudportability/">cloud portable</a> web apps. We showed how business
es could use our integrated developer tools to build modern web apps that are ÔÇ
£cloud readyÔÇØ from the start, and can be deployed to any standard environment,
including <a href="http://code.google.com/appengine/">Google App Engine&l
t;/a> and on <a href="http://www.springsource.com/products/cloud-applicati
on-platform">VMware vFabric</a> on-premise solutions. Today we are happ
y to announce that these tools will be generally available within the next few w
eeks.
D/Http (19134): </p>
D/Http (19134):
D/Http (19134): <p>
D/Http (19134): Of course, if youÔÇÖre itching to get a head start, you can j
ump right in by downloading the release candidate version of <a href="http://
www.springsource.com/landing/best-development-tool-enterprise-java">SpringSou
rce Tool Suite</a>.
D/Http (19134): </p>
D/Http (19134):
D/Http (19134): <p>
D/Http (19134): If youÔÇÖd prefer to wait for the general release, you can &l
t;a href="http://code.google.com/cloudportability/">sign up</a> to be n
otified as soon as they are
如果检查饲料(http://feeds2.feedburner.com/blogspot/Dcni),那么你会发现这只是内容的一小部分。我想,因为我收到堆消息,说手机可能没有堆空间,因此退出,但我发现一个RSS TTS项目,它有自己的http代码:talkingrssreader,当我将它们拔出并与我一起尝试代码它仍然有同样的问题。尝试使用该Feed的谈话RSS阅读器应用程序不存在此问题。
我现在不知道还有什么可以尝试的。我可以在没有问题的情况下获得并解析较短的RSS提要,但似乎在一定的长度之后,它拒绝收集所有数据。我已经浏览了Android市场上的很多RSS阅读器,并没有看到其他人将Feed缩短,所以这让我相信这是我的代码中的问题,而不是设备内存不足。我的代码很容易读取119kb xml文件,但在仅有32kb的Google RSS提要上会失败,这一点进一步证明了这一点。
任何人都可以给我一些什么问题的想法?
编辑: 添加由the100rabh和艾萨克建议的修改后,代码现在看起来是这样的:
InputStreamReader inStr = new InputStreamReader(httpConn.getInputStream());
int charsRead;
char[] buff = new char[BUFFER_SIZE];
StringBuffer data = new StringBuffer();
while((charsRead = inStr.read(buff,0,BUFFER_SIZE))!= -1)
{
data.append(buff, 0, charsRead);
}
Log.d("Http","Data: "+data.toString());
return data.toString();
的问题仍然存在,虽然。它将数据简化为与之前代码完全相同的地方。
我认为,如果你避免每次都创建的buff,乌尔问题将熄灭
BUFF =新的char [BUFFER_SIZE];
好的,这里是我最近发现的。 Log.d不打印长消息http://code.google.com/p/android/issues/detail?id=5745&q=logcat%20long%20string&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars
所以会发生什么是虽然你有数据,logcat不会打印它。你可以尝试打破字符串,然后通过logcat进行打印。您的实际应用程序不会有任何问题。
感谢您的回复,100rabh。尽管如此,代码也看到了这个问题。只有少量的rss feed数据将被解析(事实上,它停在与日志相同的地方)。我最终通过让SAXParser为我读取套接字并解析读取的信息来解决问题。我怀疑这可能是一个内存问题。 – Teario 2011-01-14 16:55:32
另外,您使用的字符串连接技术非常浪费。将'data'定义为'StringBuffer',并使用'StringBuffer.append(char [] str,int offset,int len)'而不是你现在正在做的事情。 – Isaac 2010-10-21 09:06:16
谢谢你的帮助。我现在更改了代码以添加两个建议,但问题仍然存在。输出中的GORW_HEAP和GC_FOR_MALLOC消息少得多,但数据仍然在与之前完全相同的位置截断。我会在我原来的问题结尾处发布新代码,因为它不适合这里。 – Teario 2010-10-21 10:11:31