2012-05-03 3 views
1

У меня есть проблема с Android, используя класс HttpURLConnection моего метода заключается в следующем:HttpURLConnection фатальная ошибка

public InputStream test() { 
     URL url = null; 
     try { 
      url = new URL("http://www.android.com/"); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     HttpURLConnection urlConnection = null; 
    try { 
     urlConnection = (HttpURLConnection) url.openConnection(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    InputStream in= null; 

     try { 
     in = new BufferedInputStream(urlConnection.getInputStream()); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 
     finally { 
     urlConnection.disconnect(); 
     } 
return in; 
} 

Когда я исполняю этот метод андроид генерирует это исключение:

05-03 15:15: 19.116: W/System.err (1085): android.os.NetworkOnMainThreadException 05-03 15: 15: 19.116: W/System.err (1085): at android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java: 1099) 05-03 15: 15: 19.116: W/System.err (1085): at java.net.InetAddress.lookupHostByName (InetAddress.java:391) 05-03 15: 15: 19.116: W/System.err (1085): at java.net.InetAddress.getAllByNameImpl (InetAddress.java:242) 05-03 15: 15: 19.116: W/System.err (1085): at java.net.InetAddress.getAllByName (InetAddress.java:220) 05-03 15: 15: 19.126: W/System.err (1085): на libcore.net.http. HttpConnection. (HttpConnection.java:71) 05-03 15: 15: 19.126: W/System.err (1085): at libcore.net.http.HttpConnection. (HttpConnection.java:50) 05-03 15: 15: 19.126: W/System.err (1085): на libcore.net.http.HttpConnection $ Address.connect (HttpConnection.java:351) 05-03 15: 15: 19.126: W/System.err (1085) : at libcore.net.http.HttpConnectionPool.get (HttpConnectionPool.java:86) 05-03 15: 15: 19.126: W/System.err (1085): на libcore.net.http.HttpConnection.connect (HttpConnection. java: 128) 05-03 15: 15: 19.126: W/System.err (1085): at libcore.net.http.HttpEngine.openSocketConnection (HttpEngine.java:308) 05-03 15: 15: 19.126: W/System. err (1085): на libcore.net.http.HttpEngine.connect (HttpEngine.java:303) 05-03 15: 15: 19.126: W/System.err (1085): на libcore.net.http.HttpEngine. sendSocketRequest (HttpEngine.java:282) 05-03 15: 15: 19.126: W/System.err (1085): на libcore.net.http.HttpEngine.sendRequest (HttpEngine.java:232) 05-03 15: 15: 19.126: W/System.err (1085): на libcore.net.http.HttpURLConnectionImpl.getResponse (HttpURLConnectionImpl.java:273) 05-03 15: 15: 19.136: W/System.err (1085): at libcore.net.http.HttpURLConnectionImpl.getInputStream (HttpURLConnectionImpl.java:168) 05-03 15: 15: 19.136: W/System.err (1085): at com.BertacchiMazzoni.HTTPClient.HttpClientTutorial.tes t (HttpClientTutorial.java:35) 05-03 15: 15: 19.136: W/System.err (1085): at com.BertacchiMazzoni.HTTPClient.HTTPClientActivity.onCreate (HTTPClientActivity.java:18) 05-03 15: 15: 19.136: W/System.err (1085): at android.app.Activity.performCreate (Activity.java:4465) 05-03 15: 15: 19.136: W/System.err (1085): у android. app.Instrumentation.callActivityOnCreate (Instrumentation.java:1049) 05-03 15: 15: 19.136: W/System.err (1085): at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1920) 05-03 15: 15: 19.136: W/System.err (1085): at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:1981) 05-03 15: 15: 19.136: W/System.err (1085): at android.app.ActivityThread.access $ 600 (ActivityThread.java:123) 05-03 15: 15: 19.136: W/System.err (1085): у android .app.ActivityThread $ H.handleMessage (ActivityThread.java:1147) 05-03 15: 15: 19.146: W/System.err (1085): at android.os.Handler.dispatchMessage (Handler.java:99) 05-03 15: 15: 19.146: W/System.err (1085): at android.os.Looper.loop (Looper.java:137) 05-03 15: 15: 19.146: W/System.err (1085)): at android.app.ActivityThread.main (ActivityThread.java:4424) 05-03 15: 15: 19.146: W/System.err (1085): at java.lang.reflect.Method.invokeNative (собственный метод) 05-03 15: 15: 19.146: W/System.err (1085): at java.lang.reflect.Method.invoke (Method.java:511) 05-03 15: 15: 19.146: W/System. err (1085): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:784) 05-03 15: 15: 19.146: W/System.err (1085): at com.android. internal.os.ZygoteInit.main (ZygoteInit.Java: 551) 05-03 15: 15: 19,146: W/System.err (1085): в dalvik.system.NativeStart.main (Native Method)

Могу ли я разрешить эту проблему? Где ошибка?

Большое спасибо! С уважением!

+0

У вас предоставлено разрешение ИНТЕРНЕТ в файле manifeast ... – MAC

ответ

2

Быстрый Google за исключением ведет вас здесь: http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

который гласит:

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

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

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

2

Переместите свой код в фоновый поток.

new Thread(){ 
    public void run(){ 
      test(); 
    } 
}.start(); 

Мы не можем получить доступ к сети в теме Main UI, когда версия ОС ICS, он защищает, что ваше приложение не будет блокировать пользовательский интерфейс, когда делать операцию длительной.

0

В вашем журнале говорится, что «android.os.NetworkOnMainThreadException». Это означает, что вы пытаетесь запустить этот сетевой код в основном потоке, что не очень удобно делать, поскольку доступ к сети имеет тенденцию блокироваться в течение довольно продолжительных периодов времени. Таким образом, у новой версии Android есть защита от этого и препятствует этому.

Чтобы решить эту проблему, запустите этот код в другом потоке. Например, используйте AsyncTask или простой поток java.

Смежные вопросы