Исключение HTTP-подключения к Интернету

У меня есть некоторые проблемы с эмулятором Android 3.1. Я не могу получить свой XML файл.

protected InputStream getInputStream() {
    try {

        return feedUrl.openConnection().getInputStream();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

Здесь трассировка ошибок:

08-07 22:34:26.657: ERROR/AndroidRuntime(563): Caused by: android.os.NetworkOnMainThreadException
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at java.net.InetAddress.lookupHostByName(InetAddress.java:477)
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:277)
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at java.net.InetAddress.getAllByName(InetAddress.java:249)
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:69)
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:304)
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:292)
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:274)
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1038)
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:523)
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at maps.test.BaseFeedParser.getInputStream(BaseFeedParser.java:30)
08-07 22:34:26.657: ERROR/AndroidRuntime(563):     at maps.test.DomFeedParser.parse(DomFeedParser.java:23)

Я думаю, что я не могу подключиться к Интернету, даже с <uses-permission android:name="android.permission.INTERNET"/>. Но в то же время API Google работает очень хорошо.

Ответ 1

Вызывает: android.os.NetworkOnMainThreadException

В Honeycomb они ушли и помещены в ловушку, чтобы поймать людей, пытающихся сделать потенциально длительные сетевые операции в основном потоке.

От: http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

Исключение, возникающее при попытке приложения выполнить сетевую операцию в основном потоке.

Это делается только для приложений, ориентированных на SDK Honeycomb или выше. Приложениям, использующим более ранние версии SDK, разрешено создавать сети по их основным потокам цикла событий, но это сильно обескураживает. См. Документ Проектирование для реагирования.

Также см. StrictMode.

(Обратите внимание, что вы могли бы сразу найти это самостоятельно, выполнив поиск в Интернете по исключению в верхней части сообщений об ошибках, которые вы опубликовали.)

Поскольку такие вещи, как поиск имени хоста, могут занимать длительное и неопределенное количество времени, они не должны вызываться из функций события в основном потоке, которые должны возвращаться быстро (как в течение нескольких миллисекунд). Если одна из этих функций задерживается слишком долго, Android теряет возможность отправлять сообщения в программу и может вызывать опасное диалоговое окно "Не реагировать на приложение".

Вам следует переместить свои сетевые операции (по крайней мере, любые, требующие ожидания результата или блокировки, чтобы вы могли отправить больше) в поток. Если сетевые операции исходят из части кода API, вы, вероятно, не должны называть это в основном потоке.

Ответ 2

Используйте задачу Async или

if (android.os.Build.VERSION.SDK_INT > 9) 
{
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}

Ответ 3

У вас есть

<uses-permission android:name="android.permission.INTERNET" />

в вашем манифесте Android? Он должен быть выше вашего тега application

Ответ 4

Это исключение вызывается только для приложений, ориентированных на SDK Honeycomb или выше. вы можете настроить таргетинг на ваш sdk, равный или превышающий уровень api 11. Просто измените его на уровень 8 уровня api или другой уровень api ниже 11. Ваша проблема может быть решена.

Здесь та же проблема, она была решена путем изменения уровня api.

Надеюсь, это поможет вам.!!

Ответ 5

Удалите андроид: targetSdkVersion "version_number" из вашего AndroidManifest.xml

Я удалил его, и моя проблема решена.