xmlpullparser (неверный дескриптор файла) - PullRequest
0 голосов
/ 01 июля 2018

Я довольно новичок в Android, и я пытаюсь проанализировать некоторые XML с помощью XmlPullParser, но я продолжаю получать эту ошибку (точка, в которой это происходит, довольно противоречиво, иногда это происходит дальше, прежде чем ошибки)

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
              Process: com.example.android.unescotracker, PID: 21828
              java.lang.RuntimeException: java.net.SocketException: recvfrom failed: EBADF (Bad file descriptor)

Я вызываю этот код при нажатии кнопки, после чего мой код запускается как AsyncTask:

public class DatabaseManager{
private static String LOG_TAG = DatabaseManager.class.getName();

private static String XMLSTREAM = "http://whc.unesco.org/en/list/xml/";

public static void runDatabaseManager(Boolean isConnected){
    if (isConnected) {
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                URL url = XmlUtils.createUrl(XMLSTREAM);
                InputStream stream = null;

                try {
                    stream = XmlUtils.makeHttpRequest(url);
                } catch (IOException e){
                    Log.e(LOG_TAG, "IOException Error: Trying to get URL stream", e);
                }

                updateDatabase(stream);
            }
        });
    }

}

private static void updateDatabase(InputStream stream){
    try {
        XmlUtils.getSitesFromXml(stream);
    } catch (Exception e) {
        throw new RuntimeException(e);
    } finally {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException e) {
                Log.e(LOG_TAG, "IOException Error: Trying to close xml stream", e);
            }
        }
    }
}
}

фактический класс парсера xml

public class XmlUtils {
private static String LOG_TAG = XmlUtils.class.getName();

public static void getSitesFromXml (InputStream stream) throws XmlPullParserException, IOException{
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    XmlPullParser parser = factory.newPullParser();

    parser.setInput(stream, null);

    int event = parser.getEventType();
    Log.d("XML", "Starting to read doc");
    while (event != XmlPullParser.END_DOCUMENT) {
        if (parser.getEventType() == XmlPullParser.START_TAG) {
            String name = parser.getName();

            if (name.equals("row")) {
                readSite(parser);
            }
        }
        event = parser.next();
    }
    Log.d("XML", "Finished Reading");
}

private static void readSite(XmlPullParser parser) throws XmlPullParserException, IOException {
    String siteName = "";
    String tag = "";
    int event;
    Log.d("XML", "reading new row");

    parser.require(XmlPullParser.START_TAG, null, "row");
    while (parser.next() != XmlPullParser.END_DOCUMENT) {
        event = parser.getEventType();
        if (event == XmlPullParser.END_TAG) {
            if (parser.getName().equals("row")) {
                break;
            }
            continue;
        } else if (event != XmlPullParser.START_TAG) {
            continue;
        }

        tag = parser.getName();
        Log.d("XML", tag);

        switch (tag) {
            case "site":
                siteName = readText(parser);
                Log.d("XML", siteName);
                break;
        }
        Log.d("XML", Integer.toString(parser.next()));
    }
}

// For the tags title and summary, extracts their text values.
private static String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
    String result = "";
    if (parser.next() == XmlPullParser.TEXT) {
        result = parser.getText();
        parser.nextTag();
    }
    return result;
}

// Make HTTP GET request for JSON data
public static InputStream makeHttpRequest(URL url) throws IOException {
    HttpURLConnection urlConnection = null;
    InputStream inputStream = null;

    // Catch null url and return
    if (url==null){
        return inputStream;
    }

    try{
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setReadTimeout(20000); // Milliseconds
        urlConnection.setConnectTimeout(25000); // Milliseconds
        urlConnection.setRequestMethod("GET");
        urlConnection.connect();
        int response = urlConnection.getResponseCode();

        if (response == HttpURLConnection.HTTP_OK){
            inputStream = urlConnection.getInputStream();
        }else {
            Log.e(LOG_TAG, "HTTP Request Failed, Response Code: " + urlConnection.getResponseCode());
        }
    } catch (IOException e){
        Log.e(LOG_TAG, "IOException Error: Problem getting JSON data", e);
    } finally {
        if (urlConnection != null){
            urlConnection.disconnect();
        }
    }

    return inputStream;
}

// Return URL object from String URL
public static URL createUrl(String stringUrl){
    URL url = null;

    try {
        url = new URL(stringUrl);
    } catch (MalformedURLException e){
        Log.e(LOG_TAG, "Malformed URL Error: Trying to create URL", e);
    }

    return url;
}

}

Самая большая вещь, которая смущает меня, это то, что она непоследовательна в отношении того, где происходит сбой при разборе xml. Простое перемещение журналов приведет к ошибкам в разных точках, означает ли это, что это связано с асинхронной задачей или проблемой памяти?

...