2012-05-03 26 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; 
} 

當我執行這種方法的android產生此異常:

05-03 15:15: 19.116:W/System.err(1085):android.os.NetworkOnMainThreadException 05-03 15:15:19.116:W/System.err(1085):在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):在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):at libcore.net.http.HttpConnection $ Address.connect(HttpConnection.java:351) 05-03 15:15:19.126:W/System.err(1085) :在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):at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 05-03 15: 15:19.126:W/System.err(1085):at 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):在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):at 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(Native Method) 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(本機方法)

我能解決這個問題呢?錯誤在哪裏?

非常感謝! 關心!

+0

你有在互聯網上顯示文件的權限...... – MAC

回答

2

快速谷歌爲例外這裏帶領你:http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html

其中規定:

當應用程序試圖在其主線程執行 聯網運行時所引發的異常。

這僅適用於針對Honeycomb SDK或 的應用程序。針對早期SDK版本的應用程序允許在其主要事件循環線程上執行聯網,但不鼓勵 。請參閱文檔Designing for Responsiveness。

所以基本上我猜你正在主應用程序線程上執行您的網絡操作;併爲蜂窩和它看起來像你不能這樣做。無論如何,這是一個糟糕的主意,因爲它可能會讓你的應用程序掛起而顯得沒有反應。您需要使用另一個線程或處理程序或asynctask或Loader來執行操作。

2

將您的代碼移動到後臺線程。

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

我們不能訪問網絡中的主UI線程當OS版本是ICS,它保護那些做了長時間操作時,您的應用程序不會阻止用戶界面。

0

你的日誌說「android.os.NetworkOnMainThreadException」。這意味着你試圖在主線程上運行這個網絡代碼,這不是一件好事,因爲網絡訪問往往會阻塞很長一段時間。所以更新的Android版本可以防止這種情況,並阻止您這樣做。

要解決它,請在另一個線程中運行此代碼。例如,使用AsyncTask或普通的Java線程。