2013-01-04 70 views
2

我遵循一个简单的教程(http://www.cse.nd.edu/courses/cse40814/www/RSS_Android.pdf)从一个给定的URL读取RSS提要到一个listView。我添加了INTERNET权限,Eclipse中的代码无错,但在设备或模拟器上启动时不会显示任何RSS提要。我无法让代码变得更简单,而且我使用的Feed是来自www.nba.com的稳定Feed:http://www.nba.com/rss/nba_rss.xml,尽管我已经在几个RSS Feed上进行了测试,但仍未显示Feed。Android RSS阅读器(忍者错误)

任何想法家伙?

Main.java

package com.android.simplerssreader; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import com.android.simplerssreader.data.RssItem; 
import com.android.simplerssreader.util.RssReader; 

public class Main extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    try { 

     RssReader rssReader = new RssReader(
       "http://www.nba.com/rss/nba_rss.xml"); 
     ListView Items = (ListView) findViewById(R.id.listView1); 

     ArrayAdapter<RssItem> adapter = new ArrayAdapter<RssItem>(this, 
       android.R.layout.simple_list_item_1, rssReader.getItems()); 

     Items.setAdapter(adapter); 
     Items.setOnItemClickListener(new ListListener(rssReader.getItems(), 
       this)); 

    } catch (Exception e) { 
     Log.e("SimpleRssReader", e.getMessage()); 
    } 

} 
} 

ListListener.java

package com.android.simplerssreader; 

import java.util.List; 

import com.android.simplerssreader.data.RssItem; 

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 

public class ListListener implements OnItemClickListener { 

List<RssItem> listItems; 
Activity activity; 

public ListListener(List<RssItem> listItems, Activity activity) { 
    this.listItems = listItems; 
    this.activity = activity; 
} 

public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 

    Intent i = new Intent(Intent.ACTION_VIEW); 
    i.setData(Uri.parse(listItems.get(pos).getLink())); 
    activity.startActivity(i); 

} 

} 

RssItem.java

package com.android.simplerssreader.data; 

public class RssItem { 
private String title; 
private String link; 
public String getTitle() { 
    return title; 
} 
public void setTitle(String title) { 
    this.title = title; 
} 
public String getLink() { 
    return link; 
} 
public void setLink(String link) { 
    this.link = link; 
} 

} 

RssParseHandler.java

package com.android.simplerssreader.util; 

import java.util.ArrayList; 
import java.util.List; 

import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

import com.android.simplerssreader.data.RssItem; 

public class RssParseHandler extends DefaultHandler { 

private List<RssItem> rssItems; 

private RssItem currentItem; 
private boolean parsingTitle; 
private boolean parsingLink; 

public RssParseHandler() { 
    rssItems = new ArrayList<RssItem>(); 
} 

public List<RssItem> getItems() { 
    return rssItems; 
} 

@Override 
public void startElement(String uri, String localName, String qName, 
     Attributes attributes) throws SAXException { 
    if ("content-item".equals(qName)) { 
     currentItem = new RssItem(); 
    } else if ("title".equals(qName)) { 
     parsingTitle = true; 
    } else if ("url".equals(qName)) { 
     parsingLink = true; 
    } 
} 

@Override 
public void endElement(String uri, String localName, String qName) 
     throws SAXException { 
    if ("content-item".equals(qName)) { 
     rssItems.add(currentItem); 
     currentItem = null; 
    } else if ("title".equals(qName)) { 
     parsingTitle = false; 
    } else if ("url".equals(qName)) { 
     parsingLink = false; 
    } 
} 

@Override 
public void characters(char[] ch, int start, int length) 
     throws SAXException { 
    if (parsingTitle) { 
     if (currentItem != null) 
      currentItem.setTitle(new String(ch, start, length)); 
    } else if (parsingLink) { 
     if (currentItem != null) { 
      currentItem.setLink(new String(ch, start, length)); 
      parsingLink = false; 
     } 
    } 
} 

} 

RssReader.java

package com.android.simplerssreader.util; 

import java.util.List; 

import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

import com.android.simplerssreader.data.RssItem; 

public class RssReader { 

private String rssUrl; 

public RssReader(String rssUrl) { 

    this.rssUrl = rssUrl; 
} 

public List<RssItem> getItems() throws Exception { 
    SAXParserFactory factory = SAXParserFactory.newInstance(); 
    SAXParser saxParser = factory.newSAXParser(); 

    RssParseHandler handler = new RssParseHandler(); 
    saxParser.parse(rssUrl, handler); 
    return handler.getItems(); 
} 
} 

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="#000000" 
android:orientation="vertical" > 

<ListView 
    android:id="@+id/listView1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#000000" 
    android:cacheColorHint="#FFA500" 
    android:scrollingCache="false" 
    android:textColor="#ADD8E6" > 
</ListView> 

</LinearLayout> 

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.android.simplerssreader" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-permission android:name="android.permission.INTERNET" /> 

<uses-sdk 
    android:minSdkVersion="7" 
    android:targetSdkVersion="16" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.android.simplerssreader.Main" 
     android:label="@string/title_activity_main" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

logcat的

01-04 16:22:16.171:E/SimpleRssReader(8685):无法打开http://www.nba.com/rss/nba_rss.xml

回答

1

取代

Log.e("SimpleRssReader", e.getMessage()); 

Log.e("SimpleRssReader", e.getMessage(), e); 

你失去了堆栈跟踪信息。

顺便说一句,你的错误是,你不能访问Android的网络时,你是在UI线程(蜂窝后)内:How to fix android.os.NetworkOnMainThreadException?

+0

Snicolas我想要说谢谢你借给你的专业知识开始。我改变了这一行,我开始得到正确的错误:“android.os.NetworkOnMainThreadException”。我看了一下你提供的链接,但在给它看后,我不完全确定如何在我的Main.java中实现这个。我知道我可以在我的尝试块子,但是当我扩展AsyncTask我需要什么参数?而且我并不需要声明“private exception exception”我没有这个方法“new RetreiveFeedTask()。execute(urlToRssFeed);”对?你能告诉我如何在我的Main.java中实现这个吗? – AndroidNewb

+0

这实际上是Android上的一个长话题。首先尝试使用AsyncTask并使您的代码正常工作。在这种情况下,定义一个简单的AsyncTask >,你所要做的就是在你的asynctask的doInBackGround方法内调用你的RssReader,并在你的asynctask上调用execute来传递url。请花点时间,寻找几个例子,你会做到的。但是,你应该记住,这种技术有一些缺点,当你用android更舒适时,看一看robospice,它是github上的一个lib,它提供了一个更强大的网络连接方法。 – Snicolas

+0

并接受这个答案,如果它符合您的需求。 – Snicolas