2011-08-07 17 views
16

Mam pewne problemy z moim emulatorem Androida 3.1. Nie mogę pobrać mojego pliku XML.Wyjątek połączenia z protokołem HTTP z Androidem

protected InputStream getInputStream() { 
    try { 

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

Oto ślad błędu:

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) 

myślę, że nie może połączyć się z Internetem, nawet z <uses-permission android:name="android.permission.INTERNET"/>. Ale w tym samym czasie interfejs API Google działa bardzo dobrze.

+0

możliwe duplikat [android.os.NetworkOnMainThreadException] (http://stackoverflow.com/questions/6343166/android -os-networkonmainthreadexception) – laalto

Odpowiedz

52

Spowodowany przez: android.os.NetworkOnMainThreadException

W Honeycomb pojechali i umieścić w pułapkę złapać ludzi, którzy próbują zrobić potencjalnie operacji sieciowych czasochłonnych na głównym wątku.

z: http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

wyjątkiem tego, że jest generowany, kiedy aplikacja próbuje wykonać działanie sieci na jej głównym gwintem.

Jest to zgłaszane tylko w przypadku aplikacji kierowanych na pakiet SDK Honeycomb lub wyższy. Aplikacje ukierunkowane na wcześniejsze wersje SDK mogą nawiązywać połączenia sieciowe na swoich głównych wątkach pętli zdarzeń, ale są mocno odradzane. Zobacz dokument Designing for Responsiveness.

Zobacz także StrictMode.

(Należy pamiętać, że można mieć od razu znaleźć ten sam wykonując wyszukiwania w sieci na wyjątku na górze komunikatów o błędach zostanie zaksięgowana.)

Ponieważ takie rzeczy patrząc nazwę hosta może trwać długi i nieco nieokreślony czas, nie powinny być wywoływane z funkcji zdarzeń w głównym wątku, które są wymagane do szybkiego powrotu (jak w ciągu kilku milisekund). Jeśli któraś z tych funkcji jest zbyt długa, system Android traci możliwość wysyłania wiadomości do programu i może wyświetlać okno dialogowe Nie odpowiadające na żądania aplikacji.

Powinieneś przenieść swoje operacje sieciowe (przynajmniej te, które wymagają czekania na wynik lub blokadę, aby wyczyścić, abyś mógł przesłać więcej) do wątku. Jeśli operacje sieciowe pochodzą z fragmentu kodu API, prawdopodobnie nie powinieneś wywoływać tego w głównym wątku.

+0

Otrzymuję ten sam błąd, ale mam pracę http w osobnym wątku, tj. zadanie asynchroniczne. co mogło pójść nie tak? czy mógłbyś mnie o tym poprowadzić? –

+0

Prawdopodobnie nie użyłeś poprawnie zadania asynchronicznego i albo nie wykonałeś wszystkich operacji sieciowych w metodzie tła, albo też wywołano metodę tła z wątku interfejsu użytkownika, zamiast uruchamiać zadanie asynchroniczne. Kiedy zbadasz ślad stosu, dowiesz się, które. –

+0

Sprawdziłem dokładnie, wywołanie http jest wywoływane w metodzie doInBackground(), która jest wywoływana z polecenia .execute(), wciąż zwraca strumień: org.apache.harmony.luni.internal.net.www.protocol.http. FixedLengthInputStream @ 405259f0 –

4

Czy masz

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

w Android Manifest? Należy przede tagu application

+0

Już dodałem to, nie zapominaj, że powiedziałem, że Google API działa bardzo dobrze. – oueslatibilel

+0

ale myślisz, że Google API może działać bez połączenia z Internetem? ponieważ MyLocationOverlay nie działa! ale mogę acces na mapie i dodać overlay statyczny oueslatibilel

+0

Spróbuj przesunąć znacznik zastosowań-uprawnienia powyżej aplikacji tag, więc jest Pikaling

3

Ten wyjątek jest zgłaszany tylko w przypadku aplikacji kierowanych na pakiet SDK Honeycomb lub wyższy. mogą być skierowane swoją SDK równy lub wyższy niż poziom api 11. Wystarczy go zmienić na poziomie 8 api api lub innym poziomie poniżej 11. Twój problem może być rozwiązany

Here jest ten sam problem, to już rozwiązany przez zmianę poziom api.

Mam nadzieję, że ci to pomoże. !!

+1

Kierowanie na api poniżej 11 nie działa. – logray

+1

Właściwie tak, jak to zrozumiałem, ten wyjątek jest wyrzucany w celu zapobieżenia czasochłonnym operacjom sieciowym w głównym wątku. Więc problem nie dotyczy interfejsu API, który kieruje, ale sposobu, w jaki obsługuje operacje sieciowe;) – AgentKnopf

0

Usuń android: targetSdkVersion "numer_wersji" z AndroidManifest.XML

że usuwa on a problem rozwiązany

15

asynchronicznie zadań lub

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

Jest to świetna wskazówka dla wszystkich rodzajów szybkiej oceny. Nie musisz tracić czasu na szczegóły wątku/asynchronizacji. Dzięki! –

Powiązane problemy