0

I am trying to run a tutorial I found online with this feed address: http://feeds.feedburner.com/TheTechnologyEdge

I am able to run the program just fine when using other RSS feeds, but I specifically need the feed that I listed above. I am sure the solution is relatively simple, but I cannot seem to figure out why this address will not work but others will. Below is the code I am using.

public class SolsticeRSSReaderActivity extends ListActivity

{

@SuppressWarnings("rawtypes")
private List headlines;

@SuppressWarnings("rawtypes")
private List links;

/** Called when the activity is first created. */
@SuppressWarnings(
{ "unchecked", "rawtypes" })
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    headlines = new ArrayList();
    links = new ArrayList();

    try
    {
        URL url = new URL("http://feeds2.feedburner.com/TheTechnologyEdge");

        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(false);
        XmlPullParser xpp = factory.newPullParser();

        // We will get the XML from an input stream
        xpp.setInput(getInputStream(url), "UTF_8");

        /*
         * We will parse the XML content looking for the "<title>" tag which
         * appears inside the "<item>" tag. However, we should take in
         * consideration that the rss feed name also is enclosed in a
         * "<title>" tag. As we know, every feed begins with these lines:
         * "<channel><title>Feed_Name</title>...." so we should skip the
         * "<title>" tag which is a child of "<channel>" tag, and take in
         * consideration only "<title>" tag which is a child of "<item>"
         * 
         * In order to achieve this, we will make use of a boolean variable.
         */
        boolean insideItem = false;

        // Returns the type of current event: START_TAG, END_TAG, etc..
        int eventType = xpp.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT)
        {
            if (eventType == XmlPullParser.START_TAG)
            {

                if (xpp.getName().equalsIgnoreCase("item"))
                {
                    insideItem = true;
                }
                else if (xpp.getName().equalsIgnoreCase("title"))
                {
                    if (insideItem)
                        headlines.add(xpp.nextText()); // extract the
                                                        // headline
                }
                else if (xpp.getName().equalsIgnoreCase("link"))
                {
                    if (insideItem)
                        links.add(xpp.nextText()); // extract the link of
                                                    // article
                }
            }
            else if (eventType == XmlPullParser.END_TAG
                    && xpp.getName().equalsIgnoreCase("item"))
            {
                insideItem = false;
            }

            eventType = xpp.next(); // move to next element
        }

    }
    catch (MalformedURLException e)
    {
        e.printStackTrace();
    }
    catch (XmlPullParserException e)
    {
        e.printStackTrace();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }

    // Binding data
    ArrayAdapter adapter = new ArrayAdapter(this,
            android.R.layout.simple_list_item_1, headlines);

    setListAdapter(adapter);

}

/*
 * take as an argument the feed url, and returns the input stream
 */
public InputStream getInputStream(URL url)
{
    try
    {
        return url.openConnection().getInputStream();
    }
    catch (IOException e)
    {
        return null;
    }
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
    Uri uri = Uri.parse(links.get(position) + "");
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(intent);
}

}

After I fixed the Atom issue, when I try to implement my listener I get this error. I tracked it down a bit in debug, and it seems like my uri variable is null and does not contain the html like it does when I was using this as an RSS feed.

10-15 20:10:32.445: E/AndroidRuntime(17621): FATAL EXCEPTION: main
10-15 20:10:32.445: E/AndroidRuntime(17621): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat= }
10-15 20:10:32.445: E/AndroidRuntime(17621):    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1536)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1388)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at android.app.Activity.startActivityForResult(Activity.java:3195)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at android.app.Activity.startActivity(Activity.java:3302)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at bmjohns.solstice.SolsticeRSSReaderActivity.onListItemClick(SolsticeRSSReaderActivity.java:142)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at android.app.ListActivity$2.onItemClick(ListActivity.java:319)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at android.widget.AdapterView.performItemClick(AdapterView.java:292)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at android.widget.AbsListView.performItemClick(AbsListView.java:1366)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2995)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at android.widget.AbsListView$1.run(AbsListView.java:3790)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at android.os.Handler.handleCallback(Handler.java:605)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at android.os.Handler.dispatchMessage(Handler.java:92)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at android.os.Looper.loop(Looper.java:137)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at android.app.ActivityThread.main(ActivityThread.java:4514)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at java.lang.reflect.Method.invokeNative(Native Method)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at java.lang.reflect.Method.invoke(Method.java:511)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
10-15 20:10:32.445: E/AndroidRuntime(17621):    at dalvik.system.NativeStart.main(Native Method)
Kara
  • 6,115
  • 16
  • 50
  • 57
bmjohns
  • 6,344
  • 1
  • 33
  • 39

1 Answers1

0

This URL uses Atom, not RSS. Articles begin/end with

entry

not

item
speakingcode
  • 1,518
  • 13
  • 12
  • Just as I thought, incredibly simple! Thank you very much! But one last question if you don't mind. How do you tell if a feed uses atom or RSS? – bmjohns Oct 16 '12 at 00:05
  • And actually now that I applied your fix I am able to view the article titles in my listview, but when I click on them my app breaks. What else do I need to change to have this implementation work? – bmjohns Oct 16 '12 at 00:24
  • post the error, if ya can. Highlight it in Logcat and press ctrl+c to copy it. my guess is you are calling links.get() which will return an Object type object, because you're using a raw type ArrayList, and then you're treating it as a String. Change to List links and also links = new ArrayList(); so that links.get(position) will return a string. – speakingcode Oct 16 '12 at 00:46
  • yeah I think it is something else I already changed my links.get(position) to a string by casting it with links.get(position) + ""; Either way I still applied your fix but the issue persists with the same logcat erros – bmjohns Oct 16 '12 at 01:04
  • My apologies I added the full stacktrace this time – bmjohns Oct 16 '12 at 01:13
  • Looking at the xml, looks like the url is in < feedburner:origLink >, not < link > – speakingcode Oct 16 '12 at 01:13
  • do Log.i("myActivity", uri.toString()) or something so you can see what the url you're trying is. the updated stack trace seems to indicate that the URI you're passing to the Intent is empty.. – speakingcode Oct 16 '12 at 01:16
  • Yes the uri toString() does appear to be empty, but the actual website has articles and the titles load in my listview just fine, can there be some error with reading them in since this is an Atom feed and this program was origonally designed for RSS? – bmjohns Oct 16 '12 at 01:27
  • see my comment about vs – speakingcode Oct 16 '12 at 01:31
  • Well that fixed it!! But it seems a little hardcoded now.. Can I implement this fix in a more general manner or will all feedburner type links need the feedburner:origLink declaration? – bmjohns Oct 16 '12 at 01:36
  • Probably common to all feedburner feeds, not positive though. You should refactor that code into a method inside another class. Then add a parameters to that method like (String feedUrl, String articleTag, String linkTag) etc. Then call it like FeedReader.getFeed(feedUrl, "entry", "feedburner:origLink"). I'll leave it up to you to think about what the method should return and how you link that back into your arrays in your activity. – speakingcode Oct 16 '12 at 04:35