Android http соединение исключение - PullRequest
16 голосов
/ 08 августа 2011

У меня проблемы с эмулятором 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"/>.Но в то же время Google API работает очень хорошо.

Ответы [ 5 ]

53 голосов
/ 08 августа 2011

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

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

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

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

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

Также см. StrictMode .

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

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

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

15 голосов
/ 02 июля 2013

Использовать Async Task или

if (android.os.Build.VERSION.SDK_INT > 9) 
{
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}
4 голосов
/ 08 августа 2011

Есть ли у вас

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

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

3 голосов
/ 04 января 2012

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

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

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

0 голосов
/ 11 мая 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...