Android 使用RSS解析库,不';不行。应用崩溃
我正在尝试使用这个实现来实现非常简单的RSS解析器,根据实现,我所要做的就是粘贴提供的示例代码,一旦我将代码导入到库中 我已采取的步骤:Android 使用RSS解析库,不';不行。应用崩溃,android,rss,sax,saxparser,Android,Rss,Sax,Saxparser,我正在尝试使用这个实现来实现非常简单的RSS解析器,根据实现,我所要做的就是粘贴提供的示例代码,一旦我将代码导入到库中 我已采取的步骤: 从上面提供的链接下载zip文件 从现有代码创建新项目 将添加的项目作为库添加到我的项目中 从上面提供的链接中添加示例代码,并使用try-and-catch语句对其进行修改,并添加textview作为rss提要中标题的输出 尝试并运行应用程序。它崩溃了 是因为图书馆很旧吗?我做错什么了吗?非常感谢您的帮助 代码: package com.example.rss
代码:
package com.example.rssparser;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import org.xml.sax.SAXException;
import nl.matshofman.saxrssreader.RssFeed;
import nl.matshofman.saxrssreader.RssItem;
import nl.matshofman.saxrssreader.RssReader;
import android.app.Activity;
import android.os.Bundle;
//import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView rss_feed_data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
URL url;
try {
url = new URL("http://wwwnc.cdc.gov/travel/rss/notices.xml");
RssFeed feed;
try {
feed = RssReader.read(url);
ArrayList<RssItem> rssItems = feed.getRssItems();
for(RssItem rssItem : rssItems) {
//Log.i("RSS Reader", rssItem.getTitle());
rss_feed_data = (TextView) findViewById(R.id.rss_feed_data);
rss_feed_data.setText(rssItem.getTitle());
}
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
当应用程序试图在其主线程上执行联网操作时,会引发此异常。在
AsyncTask
中运行代码:
public class MainActivity extends Activity {
TextView rss_feed_data;
String ur = "http://wwwnc.cdc.gov/travel/rss/notices.xml";
ProgressDialog pDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rss_feed_data = (TextView) findViewById(R.id.rss_feed_data);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
new XmlParsing(ur).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new String[]{null});
else
new XmlParsing(ur).execute(new String[]{null});
}
public class XmlParsing extends AsyncTask<String, String, ArrayList<RssItem>> {
// variables passed in:
String urls;
// constructor
public XmlParsing(String urls) {
this.urls = urls;
}
@Override
protected void onPreExecute() {
pDialog = ProgressDialog.show(NetActivity.this, "Fetching Details..", "Please wait...", true);
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
URL url;
try {
url = new URL();
RssFeed feed;
try {
feed = RssReader.read(url);
ArrayList<RssItem> rssItems = feed.getRssItems();
return rssItems;
}
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
// Now we have your JSONObject, play around with it.
if (pDialog.isShowing())
pDialog.dismiss();
for(RssItem rssItem : rssItems) {
//Log.i("RSS Reader", rssItem.getTitle());
rss_feed_data.setText(rssItem.getTitle());
}
}
公共类MainActivity扩展活动{
TextView rss_提要_数据;
字符串ur=”http://wwwnc.cdc.gov/travel/rss/notices.xml";
ProgressDialog;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rss_提要_数据=(TextView)findViewById(R.id.rss_提要_数据);
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.HONEYCOMB)
新的XmlParsing(ur).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,新字符串[]{null});
其他的
新建XmlParsing(ur).execute(新字符串[]{null});
}
公共类XmlParsing扩展了异步任务{
//传入的变量:
字符串URL;
//建造师
公共XML解析(字符串URL){
this.url=url;
}
@凌驾
受保护的void onPreExecute(){
pDialog=ProgressDialog.show(NetActivity.this,“正在获取详细信息…”,“请稍候…”,true);
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
//TODO自动生成的方法存根
网址;
试一试{
url=新url();
RssFeed饲料;
试一试{
feed=RssReader.read(url);
ArrayList rssItems=feed.getRssItems();
返回rssItems;
}
}捕获(SAXE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}捕获(格式错误){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//现在我们有了您的JSONObject,请使用它。
if(pDialog.isShowing())
pDialog.disclose();
用于(RssItem RssItem:rssItems){
//Log.i(“RSS阅读器”,rssItem.getTitle());
rss_feed_data.setText(rssItem.getTitle());
}
}
如果它崩溃了,你能发布你的日志吗?我已经添加了日志。我找到了这个[可能的解决方案](),但我不确定如何将其实现到我的代码中。我将发布我对它所做的操作。嘿,我不确定代码是否仅通过复制和粘贴就可以工作,但如果是这样的话,它会有很多错误。我通过eclipse建议修复了大多数错误,但其中一个错误没有推荐的解决方案可以工作。最后是rssItems,悬停在它的上方es(rssItems无法解析为变量)。我已经更新了代码。我知道它看不到上面声明的rssItems,但似乎无法解决它。@paddysal在global中使用ArrayList rssItems;
。是的,我最终解决了这个问题,尽管获取数据要花很长时间。我想我需要使用一些不同的方法。已经过了3分钟,仍然很快程…我添加了logcat,它似乎在一次又一次地做一件事。@paddysal你得到结果了吗?不,它没有返回任何东西,它只是一直在抓取,logcat充满了我上面文章最后一部分的信息。我不知道如何使它工作。我已经在你的web博客上实现了你的代码,它工作正常使用androidhive中的url,但没有尝试修改它以使用我需要的数据来源的rss源url。稍后将进行尝试。
package com.example.rssparser;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import nl.matshofman.saxrssreader.RssFeed;
import nl.matshofman.saxrssreader.RssItem;
import nl.matshofman.saxrssreader.RssReader;
import org.xml.sax.SAXException;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.widget.TextView;
//import android.util.Log;
public class MainActivity extends Activity {
TextView rss_feed_data;
String ur = "http://wwwnc.cdc.gov/travel/rss/notices.xml";
ProgressDialog pDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rss_feed_data = (TextView) findViewById(R.id.rss_feed_data);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
new XmlParsing(ur).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new String[]{null});
else
new XmlParsing(ur).execute(new String[]{null});
}
public class XmlParsing extends AsyncTask<String, String, ArrayList<RssItem>> {
// variables passed in:
String urls;
// constructor
public XmlParsing(String urls) {
this.urls = urls;
}
@Override
protected void onPreExecute() {
pDialog = ProgressDialog.show(MainActivity.this, "Fetching Details..", "Please wait...", true);
}
@Override
protected ArrayList<RssItem> doInBackground(String... params) {
// TODO Auto-generated method stub
URL url;
try {
url = new URL(urls);
RssFeed feed;
try {
feed = RssReader.read(url);
ArrayList<RssItem> rssItems = feed.getRssItems();
return rssItems;
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace(); }
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String result, ArrayList<RssItem> rssItems) {
// Now we have your JSONObject, play around with it.
if (pDialog.isShowing())
pDialog.dismiss();
for(RssItem rssItem : rssItems) {
//Log.i("RSS Reader", rssItem.getTitle());
rss_feed_data.setText(rssItem.getTitle());
}
}
}
}
11-20 05:36:50.439: I/SurfaceTextureClient(17281): [STC::queueBuffer] this:0x516a20a8, api:1, last queue time elapsed :9510 ms
11-20 05:36:50.441: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:10.505000, fps:6.282219
11-20 05:36:50.473: I/SurfaceTextureClient(17281): [STC::queueBuffer] this:0x51655180, api:1, last queue time elapsed :131816 ms
11-20 05:36:50.494: I/SurfaceTextureClient(17281): [0x51655180] frames:1, duration:131.815994, fps:0.007586
11-20 05:36:51.426: I/SurfaceTextureClient(17281): [0x516a20a8] frames:45, duration:1.016000, fps:44.289616
11-20 05:36:52.437: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.010000, fps:65.308807
11-20 05:36:53.449: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.012000, fps:65.186592
11-20 05:36:54.462: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.012000, fps:65.197708
11-20 05:36:55.474: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.012000, fps:65.203377
11-20 05:36:56.486: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.012000, fps:65.198250
11-20 05:36:57.498: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.012000, fps:65.211411
11-20 05:36:58.509: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.010000, fps:65.283676
11-20 05:36:59.520: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.010000, fps:65.318069
11-20 05:37:00.530: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.010000, fps:65.322647
11-20 05:37:01.542: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.240547
11-20 05:37:02.556: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.244469
11-20 05:37:03.565: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.245308
11-20 05:37:04.577: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.252708
11-20 05:37:05.588: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.248543
11-20 05:37:06.600: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.246178
11-20 05:37:07.611: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.253662
11-20 05:37:08.622: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.253265
11-20 05:37:09.634: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.248100
11-20 05:37:10.646: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.222153
11-20 05:37:11.656: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.010000, fps:65.313301
11-20 05:37:12.667: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.010000, fps:65.318176
11-20 05:37:13.678: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.267540
11-20 05:37:14.689: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.262505
11-20 05:37:15.701: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.258896
11-20 05:37:16.712: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.275986
11-20 05:37:17.723: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.265404
11-20 05:37:18.734: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.277664
11-20 05:37:19.745: I/SurfaceTextureClient(17281): [0x516a20a8] frames:66, duration:1.011000, fps:65.250298
public class MainActivity extends Activity {
TextView rss_feed_data;
String ur = "http://wwwnc.cdc.gov/travel/rss/notices.xml";
ProgressDialog pDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rss_feed_data = (TextView) findViewById(R.id.rss_feed_data);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
new XmlParsing(ur).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new String[]{null});
else
new XmlParsing(ur).execute(new String[]{null});
}
public class XmlParsing extends AsyncTask<String, String, ArrayList<RssItem>> {
// variables passed in:
String urls;
// constructor
public XmlParsing(String urls) {
this.urls = urls;
}
@Override
protected void onPreExecute() {
pDialog = ProgressDialog.show(NetActivity.this, "Fetching Details..", "Please wait...", true);
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
URL url;
try {
url = new URL();
RssFeed feed;
try {
feed = RssReader.read(url);
ArrayList<RssItem> rssItems = feed.getRssItems();
return rssItems;
}
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
// Now we have your JSONObject, play around with it.
if (pDialog.isShowing())
pDialog.dismiss();
for(RssItem rssItem : rssItems) {
//Log.i("RSS Reader", rssItem.getTitle());
rss_feed_data.setText(rssItem.getTitle());
}
}