Android 发送阵列适配器<;rss>;进入另一个活动意图

Android 发送阵列适配器<;rss>;进入另一个活动意图,android,android-intent,rss,Android,Android Intent,Rss,我想制作rss阅读器应用程序 我想先获取rss,然后将其传递到另一个活动使用意图中 这是我的密码: mainActivity.java public class mainActivity extends Activity { new AsyncTaskParseJson().execute(); } public class AsyncTaskParseJson extends AsyncTask<String, String, String> { protec

我想制作rss阅读器应用程序

我想先获取rss,然后将其传递到另一个活动使用意图中

这是我的密码:

mainActivity.java

public class mainActivity extends Activity {
     new AsyncTaskParseJson().execute();
}

public class AsyncTaskParseJson extends AsyncTask<String, String, String> {
     protected String doInBackground(String... arg0) {
            RssParser parser = new RssParser("https://test/feed/");
            Bundle extra = new Bundle();
                            extra.putSerializable("objects", parser);

                            Intent intent = new Intent(this, b.class);
                            intent.putExtra("extra", extra);
                            startActivity(intent);
     }
}
import java.io.IOException;
import java.io.Serializable;
import java.io.StringReader;
import java.net.URL;
import java.util.ArrayList;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;


public class RssParser extends DefaultHandler implements Serializable {

    private StringBuilder   content;
    private boolean         inChannel;
    private boolean         inImage;
    private boolean         inItem;

    private ArrayList<Item> items   = new ArrayList<Item>();
    private Channel         channel = new Channel();

    private Item            lastItem;


    public RssParser(String url) {
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            URL sourceUrl = new URL(url);
            xr.setContentHandler(this);
            xr.parse(new InputSource(sourceUrl.openStream()));
        }
        catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        catch (SAXException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }


    public class Item {

        public String title;
        public String description;
        public String link;
        public String category;
        public String pubDate;
        public String guid;
        public String imageUrl;
        public String creator;
    }


    public class Channel {

        public String title;
        public String description;
        public String link;
        public String lastBuildDate;
        public String generator;
        public String imageUrl;
        public String imageTitle;
        public String imageLink;
        public String imageWidth;
        public String imageHeight;
        public String imageDescription;
        public String language;
        public String copyright;
        public String pubDate;
        public String category;
        public String ttl;
    }


    @Override
    public void startDocument() throws SAXException {
        //        Log.i("LOG", "StartDocument");
    }


    @Override
    public void endDocument() throws SAXException {
        //        Log.i("LOG", "EndDocument");
    }


    @Override
    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
        if (localName.equalsIgnoreCase("image")) {
            inImage = true;
        }

        if (localName.equalsIgnoreCase("channel")) {
            inChannel = true;
        }

        if (localName.equalsIgnoreCase("item")) {
            lastItem = new Item();
            items.add(lastItem);
            inItem = true;
        }

        content = new StringBuilder();
    }


    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (localName.equalsIgnoreCase("image")) {
            inImage = false;
        }

        if (localName.equalsIgnoreCase("channel")) {
            inChannel = false;
        }

        if (localName.equalsIgnoreCase("item")) {
            inItem = false;
        }

        if (localName.equalsIgnoreCase("title")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.title = content.toString();
            } else if (inImage) {
                channel.imageTitle = content.toString();
            } else if (inChannel) {
                channel.title = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("dc:creator") || localName.equalsIgnoreCase("creator")) {
            if (content == null) {
                return;
            }
            lastItem.creator = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("description")) {
            if (content == null) {
                return;
            }
            if (inItem) {
                lastItem.description = android.text.Html.fromHtml(content.toString()).toString().substring(1);
                lastItem.imageUrl = this.extractImageUrl(content.toString());
            } else if (inImage) {
                channel.imageDescription = content.toString();
            } else if (inChannel) {
                channel.description = android.text.Html.fromHtml(content.toString()).toString().substring(1);
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("link")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.link = content.toString();
            } else if (inImage) {
                channel.imageLink = content.toString();
            } else if (inChannel) {
                channel.link = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("category")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.category = content.toString();
            } else if (inChannel) {
                channel.category = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("pubDate")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.pubDate = content.toString();
            } else if (inChannel) {
                channel.pubDate = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("guid")) {
            if (content == null) {
                return;
            }

            lastItem.guid = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("url")) {
            if (content == null) {
                return;
            }

            channel.imageUrl = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("width")) {
            if (content == null) {
                return;
            }

            channel.imageWidth = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("height")) {
            if (content == null) {
                return;
            }

            channel.imageHeight = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("language")) {
            if (content == null) {
                return;
            }

            channel.language = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("copyright")) {
            if (content == null) {
                return;
            }

            channel.copyright = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("ttl")) {
            if (content == null) {
                return;
            }

            channel.ttl = content.toString();
            content = null;
        }
    }


    private String extractImageUrl(String description) {
        XmlPullParserFactory factory = null;
        try {
            factory = XmlPullParserFactory.newInstance();
        }
        catch (XmlPullParserException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        XmlPullParser xpp = null;
        try {
            xpp = factory.newPullParser();
        }
        catch (XmlPullParserException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        try {
            xpp.setInput(new StringReader(description));
        }
        catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        int eventType = 0;
        try {
            eventType = xpp.getEventType();
        }
        catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if (eventType == XmlPullParser.START_TAG && "img".equals(xpp.getName())) {
                //found an image start tag, extract the attribute 'src' from here...                
                return xpp.getAttributeValue(null, "src").toString();
            }
            try {
                eventType = xpp.next();
            }
            catch (XmlPullParserException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return xpp.getAttributeValue(null, "src").toString();
    }


    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (content == null) {
            return;
        }

        content.append(ch, start, length);
    }


    public Item getItem(int index) {
        return items.get(index);
    }


    public ArrayList<Item> getItems() {
        return items;
    }
}
Bundle extra = getIntent().getBundleExtra("extra");
        RssParser p = (RssParser) extra.getSerializable("objects");
        ListView listView = (ListView) findViewById(R.id.content_frame);
        listView.setAdapter((ListAdapter) p.getItems());
我经常会遇到这样的错误:

java.lang.RuntimeException:Parcelable在写入可序列化对象时遇到IOException

java.lang.RuntimeException:包裹:无法封送值

原因:java.lang.RuntimeException:Parcelable在读取可序列化对象时遇到IOException

如果有任何建议,我真的很感激


致以最诚挚的问候

在这种情况下,请不要从
可序列化
扩展
,而是从
可打包
扩展。 发送时,请使用:

RssParser parser = new RssParser("https://test/feed/");
Bundle extra = new Bundle();
extra.putParcelable("objects", parser);
信息技术的接收:

RssParser rssParser = getIntent().getExtras().getParcelable("objects");
这样做,不是最好的选择,但很有效

错误主要是说,在收到
包裹
时发现
可序列化
。因此,我将其更改为
Parcelable

编辑

格拉德尔:

dependencies {    
    //...
    compile 'com.google.code.gson:gson:2.2.4' 
}
发送:

收到:

String toParse = getIntent().getExtras().getString("extra");
RssParser rssParser = new Gson().fromJson(toParse, RssParser.class);
编辑,我接受了测试。它起作用了

EDIT2

如果需要,则需要传递数组或列表:

Type rssListType = new TypeToken<ArrayList<RssParser>>(){}.getType();
List<RssParser> founderList = new Gson().fromJson(myStringToParse, rssListType);  
Type rssListType=new-TypeToken(){}.getType();
List founderList=new Gson().fromJson(myStringToParse,rssListType);

问候。

tnx以获取回复,但在第二个活动中,rssParser.getItems()始终为空,抛出exceptionI将检查它。请记住,您也可以使用
GSON
library.tnx将其作为
String
发送,这还不错,或者我们可以将其更改为字符串数组并轻松传递它吗?如果有帮助,请告诉我
Type rssListType = new TypeToken<ArrayList<RssParser>>(){}.getType();
List<RssParser> founderList = new Gson().fromJson(myStringToParse, rssListType);