Android RSS parsing too slow - doing something wrong?
===

I followed a tutorial on how to parse XML(RSS) files on an Android app.  Below is my code that is working, but is taking quite long.  Am I doing something incorrect or in a way that would slow it down?  It takes 7-10 seconds to load 30-35 articles... seemingly way too long, and certainly too long for a user to wait every time they switch sections (which pulls in another feed)

I do have things in place to only pull new data every hour...etc ... but the first time still takes 10 seconds usually, which - by then, the user thinks their app has crashed...etc.

**TLDR:**  
This code is too slow - why?:

    package com.mysite.utilities;
    
    import java.util.ArrayList;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.helpers.DefaultHandler;
    
    public class RSSHandler extends DefaultHandler
    {
    	
    	// creats a news item class to hold data within loop
    	public class NewsItem
    	{
    		public String title;
    		public String subhead;
    		public String link;
    		public String byline;
    		public String description;
    		public String storytext;
    		public String cmsstoryid;
    		public String pubDate;
    		public String keyword;
    		public String category;
    		public String subcategory;
    		public String slotreference;
    		public String lastModTime;
    		public ArrayList<PhotoItem> photos = new ArrayList<PhotoItem>();
    		
    		@Override
    		public String toString()
    		{
    			return title;
    		}
    	}
    	
    	//creates a photo item class to hold image data within loop
    	public class PhotoItem
    	{
    		public String photoid; //tribs id
    		public String caption;
    		public String height;
    		public String width;
    		public String photo; //full path to photo
    		public String thumbnail; //full path to thumbnail
    		public int articleid;
    		public String photolastmodified;
    		
    		@Override
    		public String toString()
    		{
    			return photo;
    		}
    	}
    	
    	//creates instances of classes to be used in loop
    	private StringBuffer buf; //to hold element characters with loop
    	private ArrayList<NewsItem> feedItems;
    	private NewsItem item;
    	private PhotoItem photoitem;
    	
    	//initialize variables of whether or not it's within an item (or photo item)
    	private boolean inItem = false;
    	private boolean inPhotoItem = false;
    	
    	//
    	public ArrayList<NewsItem> getParsedItems() {
    		return feedItems;
    	}
    	
    	//Called at the head of each new element
    	@Override
    	public void startElement(String uri, String name, String qName, Attributes atts)
    	{
    		//creates an array of news items
    		if ("channel".equals(name))
    		{
    			feedItems = new ArrayList<NewsItem>();
    		}
    		//creates a news item and toggles "in news item" to on
    		else if ("item".equals(name))
    		{
    			item = new NewsItem();
    			inItem = true;
    		}
    		//creates a photo item and toggles "in photo item" to on
    		else if ("image".equals(name))
    		{
    			photoitem = new PhotoItem();
    			inPhotoItem = true;
    		}
    		//starts a new string buffer if matches an elemnt we want from news item
    		else if (
    			("title".equals(name) ||
    			"subhead".equals(name) ||
    			"link".equals(name) ||
    			"byline".equals(name) ||
    			"description".equals(name) ||
    			"storytext".equals(name) ||
    			"keyword".equals(name) ||
    			"cmsstoryid".equals(name) ||
    			"pubDate".equals(name) ||
    			"category".equals(name) ||
    			"subcategory".equals(name) ||
    			"lastModTime".equals(name) ||
    			"slotreference".equals(name)
    			)
    			&& inItem)
    		{
    			buf = new StringBuffer();
    		}
    		//starts an a new string buffer if it matches an element we want from image item
    		else if(
    			("caption".equals(name) ||
    			"photoid".equals(name) ||
    			"height".equals(name) ||
    			"width".equals(name) ||
    			"photo".equals(name) ||
    			"photolastmodified".equals(name) ||
    			"thumbnail".equals(name)
    			)
    			&& inPhotoItem)
    		{
    			buf = new StringBuffer();
    		}
    	}
    	
    	//Called at the tail of each element end
    	@Override
    	public void endElement(String uri, String name, String qName)
    	{		
    		if ("item".equals(name))
    		{
    			feedItems.add(item);
    			inItem = false;
    		}
    		else if ("image".equals(name))
    		{
    			try {
    				item.photos.add(photoitem);
    			} catch (Exception e) {
    				System.out.println(e);
    			}
    			inPhotoItem = false;
    		}
    		else if (inItem)
    		{
    			if (inPhotoItem)
    			{
    				if ("caption".equals(name)) { photoitem.caption = buf.toString(); }
    				else if ("photoid".equals(name)) { photoitem.photoid = buf.toString(); }
    				else if ("height".equals(name)) { photoitem.height = buf.toString(); }
    				else if ("width".equals(name)) { photoitem.width = buf.toString(); }
    				else if ("photo".equals(name)) { photoitem.photo = buf.toString(); }
    				else if ("photolastmodified".equals(name)) { photoitem.photolastmodified = buf.toString(); }
    				else if ("thumbnail".equals(name)) { photoitem.thumbnail = buf.toString(); }
    			}
    			else if ("title".equals(name)) { item.title = buf.toString(); }
    			else if ("subhead".equals(name)) { item.subhead = buf.toString(); }
    			else if ("link".equals(name)) { item.link = buf.toString(); }
    			else if ("byline".equals(name)) { item.byline = buf.toString(); }
    			else if ("description".equals(name)) { item.description = buf.toString(); }
    			else if ("storytext".equals(name)) { item.storytext = buf.toString(); }
    			else if ("keyword".equals(name)) { item.keyword = buf.toString(); }
    			else if ("cmsstoryid".equals(name)) { item.cmsstoryid = buf.toString(); }
    			else if ("pubDate".equals(name)) { item.pubDate = buf.toString(); }
    			else if ("category".equals(name)) { item.category = buf.toString(); }
    			else if ("subcategory".equals(name)) { item.subcategory = buf.toString(); }
    			else if ("lastModTime".equals(name)) { item.lastModTime = buf.toString(); }
    			else if ("slotreference".equals(name)) { item.slotreference = buf.toString(); }
    			
    		}
    		else
    		{
    			buf = null;
    		}
    		
    	}
    	
    	//Called with character data inside elements
    	@Override
    	public void characters(char ch[], int start, int length)
    	{
    		//Don't bother if buffer isn't initialized
    		if(buf != null)
    		{
    			for (int i=start; i<start+length; i++)
    			{
    				buf.append(ch[i]);
    			}
    		}
    	}
    }

