1

xmlreader に問題があります。実行でき、URL は正しいのですが、startelement メソッドを実行していません。返される値はすべて null です。なぜこのようなことが起こるのか、解決策を知りたいです。ありがとうございました!

package com.headfirstlabs.nasadailyimage;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.jar.Attributes;

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

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.StrictMode;

public class IotdHandler extends DefaultHandler {
    private String url = "http://www.nasa.gov/rss/image_of_the_day.rss";
    private boolean inUrl = false;
    private boolean inTitle = false;
    private boolean inDescription = false;
    private boolean inItem = false;
    private boolean inDate = false;
    private Bitmap image = null;
    private String title = null;
    private StringBuffer description = new StringBuffer();
    private String date = null;

    public void processFeed() {
    try {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

        StrictMode.setThreadPolicy(policy); 
    SAXParserFactory factory =
    SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();
    XMLReader reader = parser.getXMLReader();
    reader.setContentHandler(this);
    InputStream inputStream = new URL(url).openStream();
    reader.parse(new InputSource(inputStream));
    }
    catch(UnknownHostException e)
    {
        title="UnknownHostException";
    }
    catch(IOException e)
    {
        title="IOException";
    }
    catch(SAXException e)
    {
        title="SAXException";
    }
    catch (Exception e) {

        title="Exception";
        System.out.println(e);
    }
    }

    private Bitmap getBitmap(String url) {
        try {
        HttpURLConnection connection =
        (HttpURLConnection)new URL(url).openConnection();
        connection.setDoInput(true);
        connection.connect();
        InputStream input = connection.getInputStream();
        Bitmap bitmap = BitmapFactory.decodeStream(input);
        input.close();
        return bitmap;
        } catch (IOException ioe) { return null; }
    }

    public void startElement(String uri, String localName, String qName,
    Attributes attributes) throws SAXException {
        if (localName.equals("url")) { inUrl = true; }
        else { inUrl = false; }
        if (localName.startsWith("item")) { inItem = true; }
        else if (inItem) {
        if (localName.equals("title")) { inTitle = true; }
        else { inTitle = false; }
        if (localName.equals("description")) { inDescription = true; }
        else { inDescription = false; }
        if (localName.equals("pubDate")) { inDate = true; }
        else { inDate = false; }
        }
    }

    public void characters(char ch[], int start, int length) {
    String chars = new String(ch).substring(start, start + length);
    if (inUrl && url == null) { image = getBitmap(chars); }
    if (inTitle && title == null) { title = chars; }
    if (inDescription) { description.append(chars); }
    if (inDate && date == null) { date = chars; }
    }


    public Bitmap getImage() { return image; }
    public String getTitle() { return title; }
    public StringBuffer getDescription() { return description; }
    public String getDate() { return date; }
}
4

1 に答える 1

4

問題は次の行にあります。

import java.util.jar.Attributes;

そのはず

import org.xml.sax.Attributes;

の 4 番目のパラメーターの型が間違っているため、startElementメソッドは でオーバーライドstartElementされず、メソッドの代わりにinDefaultHandlerの既定の実装が呼び出されます。startElementDefaultHandler

注釈を使用し@Overrideて、メソッドがスーパークラスのメソッドをオーバーライドする必要があることを示すことができます。注釈付きのメソッドが@Overrideスーパークラス メソッドをオーバーライドしない場合、コンパイラ エラーが発生します。実際、メソッドにこのアノテーションを付けると、このようなエラーが発生しますstartElement

于 2012-07-01T12:41:22.103 に答える